我有一个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创建函数。
答案 0 :(得分:0)
如果有人有兴趣,我的同事找到了解决方案:
似乎App
类必须扩展SpringBootServerInitializer
(不是其他类),并在SpringApplicationBuilder的源代码中定义自己。在那之后,@ComponentScan
开始神奇地工作。
我希望这有助于soneone。 :)