簡體   English   中英

將現有的Spring應用程序轉換為Spring-Boot

[英]Convert existing Spring application to 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;
    }
}

我的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未正確配置。

如果有人可以給我一個如何解決我的問題的提示,那將是很好的。 我相信我需要做的就是以某種方式用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;
    }

此外,我完全刪除了我的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添加到我的類路徑中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM