【问题标题】:Spring Boot - Validations stopped working after upgrade from 2.2.5 to 2.3.0Spring Boot - 从 2.2.5 升级到 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 之前和之后的类路径比较了吗?

标签: java spring spring-boot validation


【解决方案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 后解决了我的问题
    猜你喜欢
    • 2021-08-12
    • 2022-01-23
    • 2020-09-29
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多