我已经配置好一个基于Spring的REST应用程序并且它正在运行,但是现在我想将它转换为Spring-Boot。
我的应用程序使用Spring-Data-JPA在Hibernate提供程序上的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;
}
}
我使用以下配置实现了基于SpringMVC的REST端点:
@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应用程序类,但我不能百分之百确定我的配置类是否被使用,因为这种情况下会出现java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f无法转换为javax.persistence.EntityManagerFactory的错误。
另外,我尝试从应用程序类中删除@EnableAutoConfiguration注解,并手动将TomcatEmbeddedServletContainerFactory bean添加到我的上下文中,但在这种情况下,嵌入式Tomcat没有正确配置。
如果有人能给我提示如何解决我的问题,那就太好了。我相信我所需要做的就是以某种方式用Spring-Boot配置替换我的WebInitilizer。
application.properties
中。而最可维护的代码是未编写的代码。 - M. DeinumWebInitializer
并将其替换为扩展SpringBootServletInitializer
类的一个即可。 - M. Deinum