Ale*_*lex 8 java spring jpa spring-mvc spring-boot
我已配置并运行基于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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的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();
}
}
Run Code Online (Sandbox Code Playgroud)
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[]{"/"};
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我不想使用Spring-Boot自动配置,因为我想以最小的更改重用我现有的配置类,但我找不到正确的方法来执行此操作.我试图实现带注释的Spring-boot应用程序类@SpringBootApplication
,但我并不是100%确定使用了我的配置类,因为在这种情况下我得到了java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory
.
此外,我尝试从应用程序类中删除@EnableAutoConfiguration注释并TomcatEmbeddedServletContainerFactory
手动将bean 添加到我的上下文中,但在这种情况下,嵌入式tomcat未正确配置.
如果有人能给我一个如何解决我的问题的提示,那将是很棒的.我相信我需要做的就是以某种方式用Spring-Boot配置替换我的WebInitilizer.
在研究中度过了一天后,我终于找到了解决问题的方法.首先,我必须修改我的entityManagerFactory()和transactionManager()bean:
@Bean
public LocalContainerEntityManagerFactoryBean 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;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
Run Code Online (Sandbox Code Playgroud)
此外,我完全删除了我的WebInitializer
课程并从中删除了@EnableWebMvc
注释MvcConfig
.在Spring-Boot中,不可能WebMvcConfigurerAdapter
在类路径中扩展类,因为如果Spring-Boot找到它,将跳过与SpringMVC相关的所有自动配置.这是我MvcConfig
班级的最终版本:
@Configuration
@ComponentScan("foo.bar.web.controller")
public class MvcConfig {
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了doc中显示的Spring-Boot应用程序类的版本:
@SpringBootApplication(exclude = MultipartAutoConfiguration.class)
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在我的情况下,我必须MultipartAutoConfiguration
从自动配置中排除,因为我已经配置了此功能MvcConfig
.Bun也可以将其保留为自动配置,但在这种情况下,我必须在application.properties配置文件中调整允许的文件大小,或者将MultipartConfigElement bean添加到我的类路径中.
归档时间: |
|
查看次数: |
11969 次 |
最近记录: |