首页 文章

将现有的Spring应用程序转换为Spring-Boot

提问于
浏览
8

我已经配置并使用基于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 endpoints 使用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[]{"/"};
    }
}

问题是我不想重复使用现有的配置类,但是我找不到正确的方法来做到这一点 . 我试图实现用 @SrpingBootApplication 注释的Spring-boot应用程序类,但我并不是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 .

1 回答

  • 7

    在研究中度过了一天之后,我终于找到了解决问题的方法 . 首先,我必须修改我的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;
        }
    

    此外,我完全删除了 WebInitializer 类并从 MvcConfig 中删除了 @EnableWebMvc 注释 . 在Spring-Boot中,不可能在类路径中从 WebMvcConfigurerAdapter 扩展类,因为如果Spring-Boot找到它,将跳过与SpringMVC相关的所有自动配置 . 这是我的 MvcConfig 类的最终版本:

    @Configuration
    @ComponentScan("foo.bar.web.controller")
    public class MvcConfig {
    
        @Bean
        public MultipartResolver multipartResolver() {
            return new CommonsMultipartResolver();
        }
    }
    

    我使用了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);
        }
    }
    

    请注意,在我的情况下,我必须从自动配置中排除 MultipartAutoConfiguration ,因为我已经在 MvcConfig 中配置了此功能 . Bun也可以将其保留为自动配置,但在这种情况下,我必须在application.properties配置文件中调整允许的文件大小,或者将MultipartConfigElement bean添加到我的类路径中 .

相关问题