Spring Boot - 从 2.2.5 升级到 2.3.0 后验证停止工作
Posted
技术标签:
【中文标题】Spring Boot - 从 2.2.5 升级到 2.3.0 后验证停止工作【英文标题】:Spring Boot - Validations stopped working after upgrade from 2.2.5 to 2.3.0 【发布时间】:2020-09-09 13:59:50 【问题描述】:我已将 Spring Boot 项目从 2.2.5 迁移到 2.3.0,之后,验证停止工作(根本没有调用它们)。
我在更改日志文档 (https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3.0-M1-Release-Notes) 中读到,spring-boot-starter-validation
现在需要手动添加为依赖项。
所以,我将它添加到我的 pom.xml 中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我的 pom 父母是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath></relativePath>
</parent>
我的控制器如下所示:
@PostMapping( value = "/signup", consumes = MediaType.APPLICATION_JSON_VALUE )
@ResponseStatus( value = HttpStatus.OK )
public void signUp( @Valid @RequestBody ClientDto clientDto )
onboardingService.signUp( clientDto );
编辑:
我能够找到问题,请在下面查看我的答案!
感谢大家的帮助!
【问题讨论】:
请问你能显示完整的 pom.xml 吗 @CodeScale 我的 pom 非常复杂(几个 maven 模块有很多依赖项和插件)。我添加了您好,您必须使用 @Validated
注释来注释您的控制器类,请参见下面的示例:
出于测试目的,请尝试评论@Validated
注释,您不会注意到javax.validation.ConstraintViolationException: hello.name: size must be between 4 and 10
,但一旦您将其放回原处。
更多技术信息在这里Difference between @Valid and @Validated in Spring
@SpringBootApplication
public class DemoApplication
public static void main(String[] args)
SpringApplication.run(DemoApplication.class, args);
@Validated
@RestController
@RequestMapping("/hello")
class HelloController
@GetMapping
public String hello(@Valid
@NotNull(message = "Name cannot be empty")
@Size(min = 4, max = 10) @RequestParam("name") String name)
return "Hello, " + name + "!";
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
【讨论】:
感谢您的回答。它在从 Spring Boot 2.2.5 迁移到 2.3.0 之前工作。 尽管如此,我用@Validated 进行了测试,但它仍然无法正常工作。 @silenttudo.. 似乎不合逻辑.. 我们在这里谈论一个小版本,所以“没有”重大更改......它应该在不更改任何代码的情况下工作...... 您能分享任何示例项目吗,因为我刚刚创建了这个 hello 工作示例并且它开始工作,或者我们可能会进入聊天室,但升级后您仍然无法完成这项工作【参考方案2】:验证启动器不再包含在 Web 启动器中。
spring-boot-starter-validation 不再是 spring-boot-starter-web 和 spring-boot-starter-webflux 的传递依赖。
为验证工作添加此依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
【讨论】:
@ntholi 在 Spring Boot 2.3.0 版本中需要在上面添加这个依赖才能工作和使用验证 我的屏幕上奇怪的是,我将spring-boot-starter-validation
视为外部依赖项,但它无论如何都不起作用。
对我来说,问题是它不像你说的那样传递。因此,即使它存在于基础库中,它也无法在主应用程序上运行,并且还需要在其中添加它。谢谢!【参考方案3】:
实际上单元测试中有错误。验证运行良好。
对于那些遇到同样问题的人,您很可能错过了像上面 Braian Silva 建议的那样将以下依赖项添加到 pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
感谢你们的帮助!
【讨论】:
5 月 24 日以下重复帖子 @GrigoryKislin 为什么会重复?我是说单元测试是错误的,请参阅 Braian Silva 的帖子。【参考方案4】:我在这里遇到了类似的问题。但就我而言,验证警告我在 oracle 模式中遗漏了一个序列,但它就在那里。我认为这是一个错误..我将继续使用 2.4.0 版本..
【讨论】:
2.4.0 版本是否为您解决了这个问题?如果是这样,编辑您的答案以确认会很有用。【参考方案5】:根据spring boot 2.3.1 release 不再包含 spring-boot-starter-validation 和 spring starter
如何添加入门验证
行家
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Gradle
dependencies
...
implementation 'org.springframework.boot:spring-boot-starter-validation'
查看发布说明
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters
【讨论】:
【参考方案6】:解决上述问题的一个简单方法是添加:
<repositories>
<repository>
<id>Central Maven repository</id>
<name>Central Maven repository https</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
到您的 POM.xml 文件。 这将解决此版本的问题
维普尔。
【讨论】:
你能解释一下解决方案在哪里吗???这是一个 Spring-Boot 版本控制与依赖问题【参考方案7】:如果您遇到以下问题,例如:无法看到返回给客户端的验证错误(默认消息),您可以这样做:
最佳解决方案 1: 只需添加开发工具。这应该可以解决问题。在我这样做之后,我所有的绑定结果都返回给了客户端。我建议你先测试一下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
解决方案 2:
我发现这是由于使用 Spring Boot 2.3+ 因此,如果您使用的是 Spring Boot 2.3 或更高版本,请将此依赖项添加到您的 pom.xml 文件中,因为它不再包含在“web”依赖项本身中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
现在有必要将 java/resources/application.properties 中的“包含绑定错误”设置为“始终”。 'message' 也是如此,尽管我认为这是可选的。
server.error.include-message=always
server.error.include-binding-errors=always
解决方案 3:(在我发现解决方案 2 也可能有用之前)
所以我发现这是由于 Spring boot 2.3+ 造成的。但我找不到关于 Spring Boot v2.3+ 中 @Valid 的新更新用法的警告消息。
所以我最终通过调整 pom.xml 文件中的发布版本切换回 Spring boot v2.2.10(2.2 的最新版本),如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
通过回滚到旧版本,这对我来说非常有效。虽然我想有一天更新我的 Spring Boot 版本。 (重温解决方案 1 和 2)
【讨论】:
感谢解决方案 2! 这个答案挽救了一天,解决方案 2 在尝试将 Spring Boot 从 2.2.4 升级到 2.4.2 后解决了我的问题以上是关于Spring Boot - 从 2.2.5 升级到 2.3.0 后验证停止工作的主要内容,如果未能解决你的问题,请参考以下文章
更新到 Spring Boot 2 后 Jackson 模块未注册
将 Spring Boot 从 2.4.X 升级到 2.6.X 后无法运行我的 jar
Spring Boot 版本从 2.1.6 升级到 2.2.1 和 spring-cloud 问题
将 Spring Boot 项目从 JDK 8 升级到 JDK 11
独立资源服务器(Spring Boot 2 + OAuth + JWT)在 Spring-boot 从 1.2.x 升级到 2.x 后给出 UsernameNotFoundException