Java Spring启动验证注释@Valid和@NotBlank不工作

Java Spring启动验证注释@Valid和@NotBlank不工作,java,validation,spring-boot,soapui,Java,Validation,Spring Boot,Soapui,下面给出的是我的主控制器,我从中调用getPDFDetails方法 @RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST) public ResponseEntity<?> printContracts(@RequestBody final UpdatePrintContracts updatePrintContracts) throws Exception { S

下面给出的是我的主控制器,我从中调用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);
    }   
@RequestMapping(value=PATH\u PRINT\u CONTRACTS,method=RequestMethod.POST)
public ResponseEntity printContracts(@RequestBody final UpdatePrintContracts UpdatePrintContracts)引发异常{
System.out.println(“合同价值为”+updatePrintContracts);
整数cancellationReasons=service.getPDFDetails(updatePrintContracts);
System.out.println(“成功!”);
返回响应正确(取消原因);
}   
下面是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;
    }
    
}
公共类UpdatePrintContracts{
@有效的
@不空白
@模式(regexp=“\\p{Alnum}{1,30}”)
字符串isReprint;
@有效的
@不空白
整数dealerId;
@有效的
@不空白
@模式(regexp=“\\p{Alnum}{1,30}”)
字符串includeignature坐标;
@有效的
@不空白
java.util.List合同编号;
公共字符串getisrepint(){
返回isReprint;
}
public void setIsReprint(字符串isReprint){
this.isReprint=isReprint;
}
公共整数getDealerId(){
返回dealerId;
}
public void setDealerId(整数dealerId){
this.dealerId=dealerId;
}
公共字符串getIncludeDesignerCoordinates(){
返回includeDesignerCoordinates;
}
公共无效集合IncludeDesignerCoordinates(字符串IncludeDesignerCoordinates){
this.includeDesignerCoordinates=includeDesignerCoordinates;
}
public java.util.List getContractNumber(){
返回合同编号;
}
public void setContractNumber(java.util.List ContractNumber){
this.contractNumber=合同编号;
}
}

我试图通过右键单击项目(以运行方式)并通过Soap UI传递变量isrepintincludeDesignerCoordinates的空白值,将应用程序作为Spring启动应用程序运行。然而,验证似乎不起作用,并且没有在soapui中抛出任何验证错误。我错过了什么?感谢您的帮助

首先,对于UpdatePrintContracts中的类变量,不需要@Valid注释。你可以删除它们

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

@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
public ResponseEntity<?> printContracts(@Valid @RequestBody  final UpdatePrintContracts updatePrintContracts) throws Exception {
最后,我假设您的类路径中有以下JAR

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


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

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

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

因为这提供了JSR规范,而不是实现。您还可以使用
hibernate验证程序
而不是
spring boot starter验证

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

javax.validation
验证api
2.0.1.最终版本
我用spring boot starter验证替换了它,它成功了

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

org.springframework.boot
弹簧启动启动器验证
2.4.0

适用于通过2.0.1.Final获得此问题的任何人。

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

因此,您所要做的就是在build.gradle/pom文件中添加此依赖项

格拉德尔:

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


org.springframework.boot
弹簧启动启动器验证

尝试不发送isrepint/includeDesignatureCoordinates,看看是否有错误。请注意,不发送和发送blank是两件不同的事情,我希望您知道我的意思。类声明上方的@validated符号不会达到相同的目的吗?
@NotBlank
仅用于文本,而不是整数。尝试从最简单的字段开始,只使用一个字段进行验证,如
@NotBlank String foo
如果有效,请转到其他更复杂的问题,如
@Pattern
也请添加代码@Validated,在其余控制器中验证请求主体添加spring boot starter验证解决了我的问题。非常感谢。
<!-- 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>
implementation 'org.springframework.boot:spring-boot-starter-validation'
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>