java将现有Spring应用程序转换为SpringBoot
我已经配置并运行了基于Spring的REST应用程序,但现在我想将其转换为Spring引导
我的应用程序在带有Hibernate提供程序的JPA数据源之上使用Spring数据JPA:
@Configuration
@EnableJpaRepositories("foo.bar.web.repository")
@EnableTransactionManagement
public class RepositoryConfig {
// properties ommited
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(className);
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("foo.bar.web.domain");
factory.setDataSource(dataSource());
factory.setJpaPropertyMap(new HashMap<String, Object>() {{
put("hibernate.dialect", dialect);
put("hibernate.hbm2ddl.auto", hbm2ddl);
}});
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory());
return transactionManager;
}
}
我的REST端点使用SpringMVC实现,配置如下:
@Configuration
@EnableWebMvc
@ComponentScan("foo.bar.web.controller")
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
}
Web初始值设定项:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{
ApplicationConfig.class,
RepositoryConfig.class
};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
问题是我不想使用SpringBootAuto配置,因为我希望重用现有的配置类,只需进行最小的更改,但我找不到正确的方法来做到这一点。我试图实现用@SpringBootApplication
注释的Spring引导应用程序类,但我不能100%确定是否使用了我的配置类,因为在本例中,我得到了java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory
我还尝试从应用程序类中丢弃@EnableAutoConfiguration注释,并手动将TomcatEmbeddedServletContainerFactory
bean添加到我的上下文中,但在这种情况下,嵌入的tomcat没有正确配置
如果有人能给我一个如何解决我的问题的提示,那就太好了。我相信我所需要做的就是用Spring引导配置替换我的WebInitilizer
# 1 楼答案
在花了一天的时间进行研究之后,我终于发现我的问题是孤独的。 首先,我必须修改entityManagerFactory()和transactionManager()bean:
此外,我还完全删除了我的
WebInitializer
类,并从MvcConfig
中删除了@EnableWebMvc
注释。在Spring引导中,不可能从类路径中的WebMvcConfigurerAdapter
扩展类,因为如果Spring引导找到它,所有与SpringMVC相关的自动配置都将被跳过。下面是我的MvcConfig
类的最终版本:我使用了Spring Boot应用程序类的版本,如文档所示:
注意,在我的例子中,我必须从自动配置中排除
MultipartAutoConfiguration
,因为我已经在MvcConfig
中配置了这个特性。Bun也可以保持自动配置,但在这种情况下,我必须在应用程序中调整允许的文件大小。属性配置文件或将MultipartConfigElement bean添加到我的类路径