将现有的Spring应用程序转换为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自动配置,因为我想以最小的更改重用现有的配置类,但是我找不到正确的方法来做到这一点。我尝试实现使用注释的Spring-boot应用程序类@SpringBootApplication,但是我不能100%确定使用了我的配置类,因为在这种情况下,我会得到java.lang.ClassCastException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean$$EnhancerBySpringCGLIB$$ba21071f cannot be cast to javax.persistence.EntityManagerFactory

我也尝试从应用程序类中丢弃@EnableAutoConfiguration批注,然后将TomcatEmbeddedServletContainerFactorybean手动添加到我的上下文中,但是在这种情况下,嵌入式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课程,并从中删除了@EnableWebMvc注释MvcConfig在Spring-Boot中,无法从WebMvcConfigurerAdapterclasspath中扩展类,因为如果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从自动配置中排除,因为我已经在中配置了此功能MvcConfigBun也可以将其保留为自动配置,但是在这种情况下,我必须在application.properties配置文件中调整允许的文件大小,或者将MultipartConfigElement bean添加到我的类路径中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Spring Boot与现有的Spring应用程序集成

来自分类Dev

spring boot jpa在视图中打开false。如何将现有应用程序转换为不使用OSIV?

来自分类Dev

将Spring Boot JAR应用程序转换为WAR

来自分类Dev

如何将 Angular 4 与现有的基于 Spring Boot jsp 的 Web 应用程序集成?

来自分类Dev

在 Google App Engine 上部署现有的 Spring Boot 应用程序

来自分类Dev

将 Spring MVC 转换为 Spring Boot 应用程序。是否可行且值得?

来自分类Dev

无法将现有的 spring boot gradle 应用程序导入 eclispe(版本:Mars Release (4.5.0) Build id:20150621-1200)?

来自分类Dev

无法从 String 转换为 HashMap Spring Boot 应用程序

来自分类Dev

Spring Boot:我们可以在现有的Spring MVC应用程序中使用反应式Webfilter吗?

来自分类Dev

我可以使用REST Web服务和Spring Boot将Servlet中的应用程序转换为Spring吗?

来自分类Dev

在Java Spring Boot应用程序中将ProjectionList转换为JSON格式

来自分类Dev

将spring-batch-admin集成到现有的Spring Boot后无法导入属性

来自分类Dev

将Spring Boot应用程序部署到AWS Beanstalk

来自分类Dev

将Spring Boot应用程序部署为Windows服务

来自分类Dev

无法将Spring Boot应用程序部署到Azure

来自分类Dev

将MySQL连接到Spring Boot REST应用程序

来自分类Dev

Spring Boot将Web应用程序打包到.jar

来自分类Dev

将Spring Boot应用程序部署到Tomcat 8

来自分类Dev

带有Apache轴的Spring Boot应用程序

来自分类Dev

具有实时通信功能的 Spring Boot 应用程序

来自分类Dev

带有 Jquery ajax 的 Spring Boot 应用程序

来自分类常见问题

Spring Boot应用程序即服务

来自分类Dev

从Spring Boot应用程序访问SessionFactory

来自分类Dev

黄瓜测试Spring Boot应用程序

来自分类Dev

SSH访问Spring Boot应用程序

来自分类Dev

如何扩展Spring Boot应用程序?

来自分类Dev

Spring Boot应用程序未更改

来自分类Dev

Spring Boot应用程序IntelliJ

来自分类Dev

多个Spring Boot应用程序

Related 相关文章

  1. 1

    将Spring Boot与现有的Spring应用程序集成

  2. 2

    spring boot jpa在视图中打开false。如何将现有应用程序转换为不使用OSIV?

  3. 3

    将Spring Boot JAR应用程序转换为WAR

  4. 4

    如何将 Angular 4 与现有的基于 Spring Boot jsp 的 Web 应用程序集成?

  5. 5

    在 Google App Engine 上部署现有的 Spring Boot 应用程序

  6. 6

    将 Spring MVC 转换为 Spring Boot 应用程序。是否可行且值得?

  7. 7

    无法将现有的 spring boot gradle 应用程序导入 eclispe(版本:Mars Release (4.5.0) Build id:20150621-1200)?

  8. 8

    无法从 String 转换为 HashMap Spring Boot 应用程序

  9. 9

    Spring Boot:我们可以在现有的Spring MVC应用程序中使用反应式Webfilter吗?

  10. 10

    我可以使用REST Web服务和Spring Boot将Servlet中的应用程序转换为Spring吗?

  11. 11

    在Java Spring Boot应用程序中将ProjectionList转换为JSON格式

  12. 12

    将spring-batch-admin集成到现有的Spring Boot后无法导入属性

  13. 13

    将Spring Boot应用程序部署到AWS Beanstalk

  14. 14

    将Spring Boot应用程序部署为Windows服务

  15. 15

    无法将Spring Boot应用程序部署到Azure

  16. 16

    将MySQL连接到Spring Boot REST应用程序

  17. 17

    Spring Boot将Web应用程序打包到.jar

  18. 18

    将Spring Boot应用程序部署到Tomcat 8

  19. 19

    带有Apache轴的Spring Boot应用程序

  20. 20

    具有实时通信功能的 Spring Boot 应用程序

  21. 21

    带有 Jquery ajax 的 Spring Boot 应用程序

  22. 22

    Spring Boot应用程序即服务

  23. 23

    从Spring Boot应用程序访问SessionFactory

  24. 24

    黄瓜测试Spring Boot应用程序

  25. 25

    SSH访问Spring Boot应用程序

  26. 26

    如何扩展Spring Boot应用程序?

  27. 27

    Spring Boot应用程序未更改

  28. 28

    Spring Boot应用程序IntelliJ

  29. 29

    多个Spring Boot应用程序

热门标签

归档