【问题标题】:Spring boot validation annotations @Valid and @NotBlank not workingSpring Boot 验证注解 @Valid 和 @NotBlank 不起作用
【发布时间】:2018-07-14 20:22:30
【问题描述】:

下面是我调用 getPDFDetails 方法的主控制器。

@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
    public ResponseEntity<?> printContracts(@RequestBody final UpdatePrintContracts updatePrintContracts) throws Exception {
    
        System.out.println("contracts value is "+ updatePrintContracts);
        
        Integer cancellationReasons = service.getPDFDetails(updatePrintContracts);
        
        System.out.println("success!");
        
        return ResponseEntity.ok(cancellationReasons);
    }   

下面是 UpdatePrintContracts 类,我在其中定义了所有带有验证注释和相应 getter/setter 方法的变量。

public class UpdatePrintContracts {
    
    @Valid
    @NotBlank
    @Pattern(regexp = "\\p{Alnum}{1,30}")
    String isReprint;
    
    @Valid
    @NotBlank
    Integer dealerId;
    
    @Valid
    @NotBlank
    @Pattern(regexp = "\\p{Alnum}{1,30}")
    String includeSignatureCoordinates;
    
    @Valid
    @NotBlank
    java.util.List<Integer> contractNumbers;

    public String getIsReprint() {
        return isReprint;
    }

    public void setIsReprint(String isReprint) {
        this.isReprint = isReprint;
    }

    public Integer getDealerId() {
        return dealerId;
    }

    public void setDealerId(Integer dealerId) {
        this.dealerId = dealerId;
    }

    public String getIncludeSignatureCoordinates() {
        return includeSignatureCoordinates;
    }

    public void setIncludeSignatureCoordinates(String includeSignatureCoordinates) {
        this.includeSignatureCoordinates = includeSignatureCoordinates;
    }

    public java.util.List<Integer> getContractNumbers() {
        return contractNumbers;
    }

    public void setContractNumbers(java.util.List<Integer> contractNumbers) {
        this.contractNumbers = contractNumbers;
    }
    
}

我正在尝试通过右键单击项目 (Run As) 并通过 Soap 为变量 isReprintincludeSignatureCoordinates 传递空白值来将应用程序作为 Spring Boot 应用程序运行用户界面。但是,验证似乎不起作用,并且没有在 Soap UI 中引发任何验证错误。我错过了什么?任何帮助表示赞赏!

【问题讨论】:

  • @NotBlank 仅用于文本,而不是整数。尝试从最简单的开始,只有一个字段用于验证,如 @NotBlank String foo;,如果可行,则继续使用其他更复杂的字段,如 @Pattern
  • 在我的例子中,我忘记在控制器中添加@Valid 标签

标签: java validation spring-boot soapui


【解决方案1】:

如果您在最新版本的 spring boot (2.3.0) 中遇到此问题,请确保添加以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

观察: 在早期版本的 Spring Boot (1.4.7) 中,javax.validation 曾经开箱即用。但是,升级到最新版本后,注释坏了。单独添加以下依赖是行不通的:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

因为这提供了 JSR 规范但不提供实现。您也可以使用hibernate-validator 代替spring-boot-starter-validation

【讨论】:

  • 添加 spring-boot-starter-validation 解决了我的问题。谢谢!
  • 这是我的解决方案。有没有办法减少有关验证错误的信息,我的意思是跟踪消息 contions 内部代码流
【解决方案2】:

对于使用 2.0.1.Final 遇到此问题的任何人:

在 2.2 以上的所有 SpringBoot 版本中,Validations starter 不再是 web starter 的一部分

Check Notes here

所以,你所要做的就是在你的 build.gradle/pom 文件中添加这个依赖项

梯度:

implementation 'org.springframework.boot:spring-boot-starter-validation'

行家

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

【讨论】:

    【解决方案3】:

    首先,您不需要在 UpdatePrintContracts 中为这些类变量添加 @Valid 注释。您可以删除它们。

    要触发@Controller 输入的验证,只需将输入参数注释为@Valid 或@Validated:

    @RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
    public ResponseEntity<?> printContracts(@Valid @RequestBody  final UpdatePrintContracts updatePrintContracts) throws Exception {
    

    Refer here 全面了解在 Spring Boot 中验证模型。

    如果你想检查一个字符串是否只包含特定的字符,你必须添加锚点(^ 表示字符串的开头,$ 表示字符串的结尾)以确保你的模式与所有字符串匹配。大括号是只写一个数量,

    @Pattern(regexp = "^[\\p{Alnum}]{1,32}$")
    

    最后我假设你的类路径中有以下 jar,

    .validation-api.jar(包含抽象 API 和注解扫描器)

    .hibernate-validator.jar(包含具体实现)

    【讨论】:

    • 尝试不发送 isReprint /includeSignatureCoordinates ,看看是否出错。请注意,不发送和发送空白是两件事,我希望你知道我的意思
    • 类声明上方的@validated 符号不会达到同样的目的吗?
    【解决方案4】:

    我在spring boot中使用了这种验证依赖,但没有用,

    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
    

    我用 spring-boot-starter-validation 替换它并且它工作了。

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot- 
    starter-validation -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.4.0</version>
    

    【讨论】:

    • 另外请在代码中添加@Validated,其中请求主体在其余控制器中进行验证
    【解决方案5】:

    这适用于在执行上述步骤后仍然遇到相同问题的任何人。我必须重新启动我的 IDE (IntelliJ) 才能使更改生效。

    【讨论】:

      【解决方案6】:

      我遇到了同样的错误。

      我不得不单独使用以下 2 个依赖项:

            <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>
      

      并在rest控制器级别使用@Validated注解(import org.springframework.validation.annotation.Validated),在方法参数级别使用@Valid注解(import javax.validation.Valid)

      如果有任何其他额外的依赖项,例如 javax.validation.validation-apiorg.hibernate.hibernate-validator 等,那么验证对我停止工作。因此,请确保从 pom.xml 中删除这些依赖项

      【讨论】:

      • 有效。文档根本没有提到这一点。就像我们应该知道这些事情一样。
      【解决方案7】:

      我的问题由此解决。 当我们在类中使用也需要验证的类时,@Valid 在这种情况下需要对所有人进行注释。 Link for more details

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2015-01-04
        • 2021-06-23
        • 1970-01-01
        • 2020-11-22
        相关资源
        最近更新 更多