当前位置: 首页 > 知识库问答 >
问题:

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

梁丘逸仙
2023-03-14

我已经配置并运行了基于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;
    }
}

我的RESTendpoint使用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();
    }
}
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[]{"/"};
    }
}

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

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

共有1个答案

柯曜文
2023-03-14

经过一天的研究,我终于发现了我的问题。首先,我必须修改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();
    }
}

我使用了Spring-Boot应用程序类的版本,如doc:

@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);
    }
}
 类似资料:
  • 我有一个Spring MVC应用程序,使用Hibernate进行实体持久性管理。我可以在一些应用服务器上构建、部署和运行它,比如glashfish或tomcat,一切都很好。 现在,我想把它转换成一个Spring Boot应用程序。我添加了以下类: 我不知道如何使用'get BeannamesofType'并关闭allowEagerInit(我不使用XML配置)。当然,我不确定这能解决我的问题。

  • 我有一个在AWS中托管的网站,它使用了许多AWS服务。该环境是使用web控制台和AWS CLI的组合手动创建的。我想开始使用CloudFormation来管理它。我使用了CouldFormer工具来创建堆栈的模板,但我找不到一种方法来使用它来管理现有的环境。它将允许我创建一个没有太多问题的重复环境,但我真的不想删除整个生产环境,这样我就可以使用CloudFormation重新创建它。 有没有办法创

  • 问题内容: 我发现了很多互联网告诉你如何在教程 建立 一个 新的 与AngularJS科尔多瓦的应用程序,这很好。 但是,如果我的AngularJS网络应用程序还可以正常运行并且又想从中创建一个移动应用程序(Android / IOS),该怎么办?这可能/可行/明智吗? 如果是,您可以提供一些建议,还是指向一些记录此任务的现有资源? 问题答案: 正如dmahapatro所说,将AngularJS应

  • 我有一个带有POST REST API的SpringBoot2.2 webservice。我正在使用Okhttp客户机向第三方服务发出请求。我希望将第三方服务的确切响应返回给我的WebService的调用者。所有okhttp食谱都参考: 我尝试在api中返回okhttp响应,但我只返回调用方示例: 有人知道如何将Okhttp响应对象转换为Spring ResponseEntity对象以便返回htt

  • 我想“包装”这个遗留应用程序并用Spring-Boot启动它。然而,我很难弄清楚如何做到这一点,因为所有示例似乎都假设创建一个“新”应用程序。 1)我有我现有的applicationcontext.xml文件,其中包含我现有的spring app bean声明 2)为了启动spring-boot/tomcat,并将所有现有bean加载到spring-boot包装的上下文中,我需要添加到现有Spri

  • 问题内容: 是否可以将Java应用程序转换为Mac OS X可执行应用程序? 我使用NetBeans进行Java开发,我想将“ dist”文件夹“打包”到应用程序中(为方便起见) 问题答案: 使用Apple Java扩展及其指南 在苹果Java扩展包含的信息非常完整的开发指南的Java应用程序在Mac OS X上部署 和生产应用捆绑。它还介绍了Apple Java扩展的其他方面,例如对与标准Mac