Spring 启动验证注释@Valid 和@NotBlank 不工作
Spring boot validation annotations @Valid and @NotBlank not working
下面是我的主控制器,我从中调用 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 class,我在其中定义了所有带有验证注释的变量和相应的 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 引导应用程序,方法是右键单击项目 (运行 As) 并为变量传递空白值 isReprint 和 includeSignatureCoordinates 通过 Soap UI。然而,验证似乎不起作用,并且没有在 Soap UI 中抛出任何验证错误。我错过了什么?感谢您的帮助!
首先,您不需要为 UpdatePrintContracts 中的那些 class 变量添加 @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 引导中的验证模型。
并且如果你想检查一个字符串是否只包含特定的字符,你必须添加锚点(^ 表示字符串的开头,$ 表示字符串的结尾)以确保你的模式匹配所有 string.Curly括号里只写一个数量,
@Pattern(regexp = "^[\p{Alnum}]{1,32}$")
最后,我假设您的 class 路径中有以下 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>
观察:
在 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 启动时使用了这种验证依赖关系,但没有用,
<!-- 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>
对于使用 2.0.1.Final 遇到此问题的任何人:
在 2.2 以上的所有 SpringBoot 版本中,Validations starter 不再是 web starter 的一部分
因此,您所要做的就是在您的构建中添加此依赖项。gradle/pom 文件
GRADLE:
implementation 'org.springframework.boot:spring-boot-starter-validation'
马文
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这适用于在执行上述步骤后仍然遇到相同问题的任何人。我必须重新启动 IDE (IntelliJ) 才能使更改生效。
我遇到了同样的错误。
我不得不单独使用以下 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
注释(导入 org.springframework.validation.annotation.Validated),在方法参数级别使用 @Valid
注释(导入 javax.validation.Valid)
如果有任何其他额外的依赖项,如 javax.validation.validation-api
、org.hibernate.hibernate-validator
等,那么验证对我来说就停止了。因此,请确保从 pom.xml
中删除这些依赖项
我的问题就这样解决了。
当我们在 类 中使用 类 时,也需要验证,因此在这种情况下,需要对所有 @Valid
进行注释。
Link for more details
下面是我的主控制器,我从中调用 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 class,我在其中定义了所有带有验证注释的变量和相应的 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 引导应用程序,方法是右键单击项目 (运行 As) 并为变量传递空白值 isReprint 和 includeSignatureCoordinates 通过 Soap UI。然而,验证似乎不起作用,并且没有在 Soap UI 中抛出任何验证错误。我错过了什么?感谢您的帮助!
首先,您不需要为 UpdatePrintContracts 中的那些 class 变量添加 @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 引导中的验证模型。
并且如果你想检查一个字符串是否只包含特定的字符,你必须添加锚点(^ 表示字符串的开头,$ 表示字符串的结尾)以确保你的模式匹配所有 string.Curly括号里只写一个数量,
@Pattern(regexp = "^[\p{Alnum}]{1,32}$")
最后,我假设您的 class 路径中有以下 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>
观察:
在 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 启动时使用了这种验证依赖关系,但没有用,
<!-- 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>
对于使用 2.0.1.Final 遇到此问题的任何人:
在 2.2 以上的所有 SpringBoot 版本中,Validations starter 不再是 web starter 的一部分
因此,您所要做的就是在您的构建中添加此依赖项。gradle/pom 文件
GRADLE:
implementation 'org.springframework.boot:spring-boot-starter-validation'
马文
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这适用于在执行上述步骤后仍然遇到相同问题的任何人。我必须重新启动 IDE (IntelliJ) 才能使更改生效。
我遇到了同样的错误。
我不得不单独使用以下 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
注释(导入 org.springframework.validation.annotation.Validated),在方法参数级别使用 @Valid
注释(导入 javax.validation.Valid)
如果有任何其他额外的依赖项,如 javax.validation.validation-api
、org.hibernate.hibernate-validator
等,那么验证对我来说就停止了。因此,请确保从 pom.xml
我的问题就这样解决了。
当我们在 类 中使用 类 时,也需要验证,因此在这种情况下,需要对所有 @Valid
进行注释。
Link for more details