将start.spring.io升级到Spring Boot 2

工程 | Stéphane Nicoll | 2018年3月12日 | ...

Spring Boot 2最近发布,同一天生产实例Spring Initializr (start.spring.io)也升级到了Spring Boot 2。

在这篇文章中,我想带你了解将Spring Boot 1.x应用程序升级到Spring Boot 2的过程。

发行说明和迁移指南

第一步是阅读迁移指南发行说明,熟悉Spring Boot 2中的主要更改。

构建升级

如果您使用Maven和spring-boot-starter-parent,则需要注意的是,作为升级的一部分,将更新多个插件。如果您没有使用父级,则值得检查您的构建并升级正在使用的插件。Spring Initializr 使用 Maven 构建,因此最简单的方法是扫描spring-boot-dependencies并在必要时升级您正在使用的插件。

升级到Spring Boot 2

Initializr具有专门的自动配置功能,可以自动配置服务。它还公开了专门的指标,因此它超越了使用现有功能。第一步是检查由于重命名和重新定位而导致的一些基本编译错误。

对于Initializr来说,最大的变化是迁移到micrometer,因为CounterServiceGaugeService不再可用。幸运的是,通过注入MeterRegistry修复编译错误相当容易。然后,我们可以使用注册表为每个元素检索一个Counter以进行递增。

我们当然需要改进与Micrometer的集成,但这个基本更改足以让我们开始。

属性迁移

我们还没有查看测试套件,但我们可以试用该应用程序以获得第一印象。在此之前,让我们将属性迁移器添加到构建中。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

或者,如果您使用的是Gradle

runtime("org.springframework.boot:spring-boot-properties-migrator")

如果我们运行该应用程序,它将识别不再由Spring Boot管理的属性。如果存在替换项,它将使用警告为您暂时重新映射属性。如果没有替换,错误报告将为您提供更多信息。无论哪种方式,在更新配置后都必须更新配置并删除依赖项。

在继续之前,最好使用IDE的搜索功能仔细检查您是否没有在集成测试中使用已迁移的属性之一。在Initializr的情况下,使用了management.security.enabled,并且也必须迁移

因此应用程序现在启动了。在继续之前,让我们看一下测试套件。

测试基础设施

作为升级的一部分,测试实用程序也已升级(我们主要使用AssertJ和Mockito)。AssertJ 有一个有趣的行为变化:String 上的 containsSequence 停止允许序列中的空洞(为此行为引入了 containsSubSequence)。Mockito 的升级很顺利(ArgumentMatcher 现在是一个接口,并且必须更改 argThat 的导入)。

我们还使用PropertiesConfigurationFactory将POJO绑定到Environment的前缀。在2.0中,引入了全新的Binder API,它更灵活且更易于使用。我们原本需要10行代码的绑定可以简化为3行简单的代码

最后,我们的自动配置测试现在可以受益于ApplicationContextRunner,而不是自己创建ApplicationContext并管理其生命周期。此功能在另一篇博文中进行了详细介绍

我们现在可以运行测试,并意识到有一些测试失败了。该服务的首页在浏览器中无法正常工作!一些通过端点练习创建构建脚本的测试也失败了。

Mustache前缀更改

模板不再呈现的原因是Mustache模板的前缀已更改。将我们的模板重命名为.mustache足以解决此问题。

Spring MVC路径匹配默认行为更改

第二个问题是滥用了我们端点中的路径匹配。允许您创建pom.xml文件的端点如下所示

@RequestMapping("/pom")
@ResponseBody
public ResponseEntity<byte[]> pom(BasicProjectRequest request) { ... }

用户应该调用/pom.xml,这应该是我们最初映射的内容。在Spring Boot 2中,Spring MVC路径匹配的默认行为已更改,因此此端点不再匹配。

一个简单的解决方法是

@RequestMapping(path = { "/pom", "/pom.xml" })
@ResponseBody
public ResponseEntity<byte[]> pom(BasicProjectRequest request) { ... }

/info重定向

https://start.spring.io/info 是一个众所周知的URL,用于检索Spring Initializr当前使用的版本映射。它通常允许您知道哪个Spring Cloud版本与您当前的Spring Boot版本匹配。

Spring Boot 2 将执行器端点移动到/actuator,我们希望遵循该默认设置。但这并不意味着我们想破坏用户可能已添加书签的URL。为了充分利用两全其美的方法,我们可以添加一个简单的重定向

@Bean
public WebMvcConfigurer initializrWebMvcConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addRedirectViewController("/info", "/actuator/info");
        }
    }
}

总结

最终,将Spring Initializr迁移到Spring Boot 2 非常容易。提前阅读发行说明和迁移指南以了解可能影响您的应用程序的更改至关重要。自Spring Boot 2发布以来,start.spring.io 一直为全球社区每天快乐地生成数万个项目。

下一步是将指标正确迁移到Micrometer,放弃分层名称并改用标签。如果您有兴趣了解更多信息,请订阅#526

获取Spring通讯

通过Spring通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加快您的进步。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部