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 模块有很多依赖项和插件)。我添加了 部分。你还有什么感兴趣的吗?感谢您的帮助。 你可以参考这里docs.spring.io/spring/docs/current/javadoc-api/org/…这是springs实现,尝试将@Validated添加到你的控制器 @silentsudo 在从 Spring Boot 2.2.5 迁移到 2.3.0 之前它正在工作 @martins.tuga 之前和之后的类路径比较了吗? 【参考方案1】:

您好,您必须使用 @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 1.5升级到2.0

将 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