领先一步
VMware 提供培训和认证,为您的进步加速。
了解更多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
并在必要时升级您正在使用的插件。
Initializr 有专用的自动配置来自动配置服务。它还暴露了专用的指标,因此它超越了使用现有功能。第一步是查看由于重命名和重定位引起的一些基本编译错误。
对于 Initializr 而言,最大的变化是转向了 micrometer,因为 CounterService
和 GaugeService
不再可用。幸运的是,通过注入 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
就足以解决该问题。
第二个问题是我们端点中路径匹配的滥用。允许您创建 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。