【发布时间】:2015-05-26 13:08:20
【问题描述】:
我已经配置并运行了基于 Spring 的 REST 应用程序,但现在我想将其转换为 Spring-Boot。
我的应用程序在带有 Hibernate 提供程序的 JPA 数据源之上使用 Spring-Data-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[]{"/"};
}
}
问题是我不想使用 Spring-Boot 自动配置,因为我想重用我现有的配置类,只做很少的改动,但我找不到正确的方法来做到这一点。我尝试实现使用@SpringBootApplication 注释的Spring-boot 应用程序类,但我不能100% 确定我的配置类是否被使用,因为在这种情况下我得到java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory。
我还尝试从应用程序类中丢弃 @EnableAutoConfiguration 注释并手动将 TomcatEmbeddedServletContainerFactory bean 添加到我的上下文中,但在这种情况下,嵌入式 tomcat 配置不正确。
如果有人能给我提示如何解决我的问题,那就太好了。我相信我需要做的就是以某种方式将我的 WebInitilizer 替换为 Spring-Boot 配置。
【问题讨论】:
-
我建议使用自动配置功能,因为这可以让您基本上放弃大部分配置或放入
application.properties。最好的可维护代码是不写的代码。 -
我完全同意你的观点,自动配置是一个很好的功能,但这是我的教育项目,我认为手动配置对于了解所有这些功能的工作原理以及它们与“传统 SpringMVC"
-
所以你基本上不想使用 Spring Boot 或者至少正在努力尽可能少地使用它。但是,如果你真的必须放弃你的
WebInitializer并用扩展SpringBootServletInitializer类来替换它。 -
部分你是对的。我想在我的项目中包含 Spring-Boot 的唯一一个目的是,我需要将我的应用程序打包到带有嵌入式 servlet 容器的可执行 jar 中。现在花了一些时间研究后,我正在努力用
SpringBootServletInitializer替换我的WebInitializer
标签: java spring spring-mvc jpa spring-boot