代码之家  ›  专栏  ›  技术社区  ›  Andrey D.

Spring集成-ErrorMessageExceptionTypeRouter NullPointerException-如何修复?[副本]

  •  0
  • Andrey D.  · 技术社区  · 7 年前

    我做了一个简单的测试,结果不起作用。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @ContextConfiguration(classes = {SIConfiguration.class, ExceptionTypeRouter.class})
    public class ExceptionTypeRouterTest {
    
        @Autowired
        @Qualifier("inDefaultChannel")
        private DirectChannel in;
    
        @Test
        public void fistRouteTest() {
    
            in.send(new GenericMessage<>("ready!"));
    
        }
    }
    
    
    @Configuration
    @Slf4j
    public class ExceptionTypeRouter {
    
        @Bean
        @Qualifier("inDefaultChannel")
        public DirectChannel inDefaultChannel() {
            return MessageChannels
                    .direct()
                    .get();
        }
    
        @Bean
        @Qualifier("directErrorChannel")
        public DirectChannel directErrorChannel() {
            return MessageChannels
                    .direct()
                    .get();
        }
    
        @Bean
        public ErrorMessageExceptionTypeRouter errorMessageExceptionTypeRouter() {
            ErrorMessageExceptionTypeRouter router = new ErrorMessageExceptionTypeRouter();
            router.setChannelMapping(IOException.class.getName(), "directErrorChannel");
            router.setChannelMapping(NullPointerException.class.getName(), "directErrorChannel");
            router.setDefaultOutputChannel(outDefaultChannel());
    
            return router;
        }
    }    
    

    问题就在这里。把这个粘起来。getApplicationContext()为null。

     private Class<?> resolveClassFromName(String className) {
            try {
                return ClassUtils.forName(className, this.getApplicationContext().getClassLoader());
            } catch (ClassNotFoundException var3) {
                throw new IllegalStateException("Cannot load class for channel mapping.", var3);
            }
        }
    

    错误日志:

    组织。springframework。豆子。工厂BeanCreationException:创建名为“errorMessageExceptionTypeRouter”的bean时出错 在集成中定义。例外情况MO。配置路由器。ExceptionTypeRouter:通过工厂方法实例化Bean 失败;嵌套异常为org。springframework。豆子。BeanInstationException:未能实例化[org.springframework]。 集成。路由器。ErrorMessageExceptionTypeRouter]:工厂方法“ErrorMessageExceptionTypeRouter”引发异常;嵌套的 java是个例外。lang.NullPointerException

    1 回复  |  直到 7 年前
        1
  •  1
  •   Artem Bilan    7 年前

    同意。这就是 ErrorMessageExceptionTypeRouter

    当你打电话的时候 setChannelMapping() 它不会检查 this.initialized 试着打电话给 resolveClassFromName() 当我们没有 ApplicationContext 尚未填充。

    请提出一个JIRA来解决它: https://jira.spring.io/projects/INT

    同时,作为一种解决方法,您应该考虑使用 setChannelMappings(Map<String, String>) 而是:

    @Bean
    public ErrorMessageExceptionTypeRouter errorMessageExceptionTypeRouter() {
        ErrorMessageExceptionTypeRouter router = new ErrorMessageExceptionTypeRouter();
        Map<String, String> mappings = new HashMap<>();
        mappings.put(IOException.class.getName(), "directErrorChannel");
        mappings.put(NullPointerException.class.getName(), "directErrorChannel");
        router.setChannelMappings(mappings);
        router.setDefaultOutputChannel(outDefaultChannel());
    
        return router;
    }