在spring应用程序中打包成战时不调用bean创建器函数

时间:2015-03-07 09:02:37

标签: java spring war

我有一个Spring REST应用程序,如果使用带有嵌入式tomcat的mvn exec运行(bean被创建好,@Autowired按预期工作等),它可以正常工作。

但是,如果我使用mvn包创建一个WAR并将其部署到现有的tomcat中,则不会调用某些bean创建者函数。

例如,我有一个bean创建者函数

@Bean
@Autowired
public ObjectMapper objectMapper(LocalizedMessages messages) {
    // create and configure ObjectMapper with custom serializer
}

使用嵌入式tomcat时会调用它,并且在使用war时不会调用它。我试图将包含类添加到SpringApplicationBuilder的源代码中,但这没有任何效果。

有没有人建议如何让战争版本正常运作?

一些额外的细节

我使用Spring-boot 1.2和spring-boot-starter-web maven依赖,最初我使用App类和main函数来创建和启动一个新的SpringApplication(反过来又启动了嵌入式tomcat),App类也有适当的@ComponentScan@EnableAutoConfiguration注释,以便所有@Component@Configuration都适当处理。

通过war包装,我创建了一个扩展SpringBootServletInitializer的类,并有一个@SpringBootApplication注释,将上面的App.class添加到SpringApplicationBuilder的源列表中(参见generating a working war file with maven for a spring-boot web application) 。我甚至尝试在源代码中列出所有 @Component,但仍然没有调用上面提到的bean创建函数。

1 个答案:

答案 0 :(得分:0)

如果有人有兴趣,我的同事找到了解决方案:

似乎App类必须扩展SpringBootServerInitializer(不是其他类),并在SpringApplicationBuilder的源代码中定义自己。在那之后,@ComponentScan开始神奇地工作。

我希望这有助于soneone。 :)