将 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,您需要注意升级过程中会有几个插件更新。如果您没有使用 parent,检查您的构建并升级您使用的插件是值得的。Spring Initializr 是用 Maven 构建的,所以最简单的方法是扫描 spring-boot-dependencies 并在必要时升级您正在使用的插件。

升级到 Spring Boot 2

Initializr 有专用的自动配置来自动配置服务。它还暴露了专用的指标,因此它超越了使用现有功能。第一步是查看由于重命名和重定位引起的一些基本编译错误。

对于 Initializr 而言,最大的变化是转向了 micrometer,因为 CounterServiceGaugeService 不再可用。幸运的是,通过注入 MeterRegistry修复编译错误相当容易。然后我们可以使用 registry 为每个元素获取一个 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 端点移至 /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 社区所有即将举行的活动。

查看全部