[英]Spring boot validation annotations @Valid and @NotBlank not working
下面给出的是我的主要 controller,我从中调用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;
}
}
我试图通过右键单击项目(运行方式)并通过 Soap UI 传递变量isReprint和includeSignatureCoordinates的空白值,将应用程序作为 Spring 启动应用程序运行。 但是,验证似乎不起作用,并且不会在 Soap UI 中抛出任何验证错误。 我错过了什么? 任何帮助表示赞赏!
如果您在最新版本的 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
。
对于在2.0.1.Final 中遇到此问题的任何人:
在 2.2 以上的所有 SpringBoot 版本中, Validations starter 不再是 web starter 的一部分
所以,你所要做的就是在你的 build.gradle/pom 文件中添加这个依赖项
等级:
implementation 'org.springframework.boot:spring-boot-starter-validation'
行家
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
首先,您不需要为 UpdatePrintContracts 中的那些类变量添加 @Valid 注释。 您可以删除它们。
要触发 @Controller 输入的验证,只需将输入参数注释为 @Valid 或 @Validated:
@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
public ResponseEntity<?> printContracts(@Valid @RequestBody final UpdatePrintContracts updatePrintContracts) throws Exception {
请参阅此处以全面了解 Spring Boot 中的验证模型。
如果你想检查一个字符串是否只包含特定的字符,你必须添加锚点(^ 表示字符串的开头,$ 表示字符串的结尾)以确保你的模式匹配所有字符串。大括号只写一个数量,
@Pattern(regexp = "^[\\p{Alnum}]{1,32}$")
最后,我假设您的类路径中有以下 jars,
.validation-api.jar(包含抽象API和注解扫描器)
.hibernate-validator.jar(包含具体实现)
我在 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>
我的问题由此解决。 当我们在类中使用也需要验证的类时,在这种情况下需要将@Valid
注释给所有类。 链接了解更多详情
这适用于在执行上述步骤后仍然遇到相同问题的任何人。 我必须重新启动我的 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>
并在其余控制器级别使用@Validated
annotation(import org.springframework.validation.annotation.Validated) 并在方法参数级别使用@Valid
annotation(import javax.validation.Valid)
如果有任何其他额外的依赖项,如javax.validation.validation-api
、 org.hibernate.hibernate-validator
等,那么验证对我来说就停止工作了。 因此,请确保从 pom.xml 中删除这些依赖项
您必须在 pom.xml 中添加此依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Step-1:在pom.xml文件中添加这两个依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
第 2 步:像这样创建自定义异常 class
package com.bjit.salon.auth.service.exceptions;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.stream.Collectors;
@ControllerAdvice
public class AnynameApplicationException {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResponseEntity<List<String>> processUnmergeException(final
MethodArgumentNotValidException ex) {
List<String> list = ex.getBindingResult().getAllErrors().stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList());
return new ResponseEntity<>(list, HttpStatus.BAD_REQUEST);
}
}
Step-3:像这样在方法arguments中添加@Valid注解
public ResponseEntity<?> registerAccount(@Valid @RequestBody UserRegisterDto
registerDto) {
// rest of the codes
}
确保在@RequestBody 之前使用@Valid 注解
对于较新版本的 spring 引导,确保所有验证注释均来自jakarta.validation.*
package 而不是javax.validation.*
。 由于注释在两者中的名称相同。
您可以使用 @NotEmpty 来检查空白值和 null 值。 将 @Valid 添加到您的 RestContoller class 方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.