有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将现有Spring应用程序转换为SpringBoot

我已经配置并运行了基于Spring的REST应用程序,但现在我想将其转换为Spring引导

我的应用程序在带有Hibernate提供程序的JPA数据源之上使用Spring数据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[]{"/"};
    }
}

问题是我不想使用SpringBootAuto配置,因为我希望重用现有的配置类,只需进行最小的更改,但我找不到正确的方法来做到这一点。我试图实现用@SpringBootApplication注释的Spring引导应用程序类,但我不能100%确定是否使用了我的配置类,因为在本例中,我得到了java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory

我还尝试从应用程序类中丢弃@EnableAutoConfiguration注释,并手动将TomcatEmbeddedServletContainerFactorybean添加到我的上下文中,但在这种情况下,嵌入的tomcat没有正确配置

如果有人能给我一个如何解决我的问题的提示,那就太好了。我相信我所需要做的就是用Spring引导配置替换我的WebInitilizer


共 (1) 个答案

  1. # 1 楼答案

    在花了一天的时间进行研究之后,我终于发现我的问题是孤独的。 首先,我必须修改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引导中,不可能从类路径中的WebMvcConfigurerAdapter扩展类,因为如果Spring引导找到它,所有与SpringMVC相关的自动配置都将被跳过。下面是我的MvcConfig类的最终版本:

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

    我使用了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也可以保持自动配置,但在这种情况下,我必须在应用程序中调整允许的文件大小。属性配置文件或将MultipartConfigElement bean添加到我的类路径