Spring启动验证注释@Valid和@NotBlank无法正常工作

时间:2018-02-05 01:30:26

标签: java validation spring-boot soapui

以下是我的主控制器,我从中调用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;
    }

}

我试图通过右键单击项目(运行方式)将应用程序作为Spring启动应用程序运行,并通过Soap UI传递变量isReprint和includeSignatureCoordinates的空白值。但是,验证似乎不起作用,并且不会在Soap UI上抛出任何验证错误。我错过了什么?任何帮助表示赞赏!

6 个答案:

答案 0 :(得分:42)

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

#!/usr/bin/env bash
seq 4 | perl -pe '
BEGIN {
    open CSV, shift; # Open test_file.csv
    <CSV>; # Ignore first line
    # Get line number and command
    ($n, $c) = <CSV> =~ /^(?:[^,]+,){2}([^,]+),(.*)/;
    }
{ s/.*/$c/ if ($. == $n); } # Replace line with number $n
' test_file.csv

观察: 在早期版本的Spring Boot(1.4.7)中,<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 可以直接使用。但是,升级到最新版本后,注释破裂了。单独添加以下依赖项无效:

javax.validation

因为这提供了JSR规范,但没有提供实现。您也可以使用<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> 代替hibernate-validator

答案 1 :(得分:15)

对于任何在 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>

答案 2 :(得分:6)

首先,您不需要在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充分了解弹簧启动时的验证模型。

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

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

最后,我假设您在类路径中有以下jar,

.validation-api.jar(包含抽象API和注释扫描程序)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

我遇到了同样的错误。

我不得不单独使用以下 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 中删除这些依赖

答案 5 :(得分:0)

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