Spring boot验证注解@Valid和@NotBlank不起作用

问题描述 投票:0回答:15

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

我试图通过右键单击项目(运行方式)并通过 Soap UI 传递变量 isReprintincludeSignatureCooperatives 的空白值来将应用程序作为 Spring Boot 应用程序运行。但是,验证似乎不起作用,并且不会在 Soap UI 中引发任何验证错误。我缺少什么?如有任何帮助,我们将不胜感激!

java validation spring-boot soapui
15个回答
123
投票

如果您在最新版本的 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


37
投票

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

22
投票

我遇到了同样的错误。

我必须单独使用以下 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
注释(导入 org.springframework.validation.annotation.Validated),在方法参数级别使用
@Valid
注释(导入 javax.validation.Valid)

如果还有任何其他额外的依赖项,例如

javax.validation.validation-api
org.hibernate.hibernate-validator
等,那么验证对我来说就停止工作了。因此,请确保从 pom.xml 中删除这些依赖项


19
投票

首先,您不需要为 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}$")

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

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

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


10
投票

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

8
投票

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


8
投票

确保在@RequestBody之前使用@Valid注解

对于较新版本的 Spring Boot,请确保所有验证注释均从

jakarta.validation.*
包中选取,而不是从
javax.validation.*
中选取。由于两者的注释名称相同。


5
投票

我的问题就这样解决了。 当我们在类中使用也需要验证的类时,在这种情况下需要对所有类进行注释。

更多详情请点击链接


2
投票
Step-1:在pom.xml文件中添加这两个依赖

@Valid

第 2 步:创建一个像这样的自定义异常类

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

步骤3:像这样向方法参数添加@Valid注释

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); } }



2
投票

并且使用 Kotlin 你应该添加 @field:Annotation

例如:

public ResponseEntity<?> registerAccount(@Valid @RequestBody UserRegisterDto registerDto) { // rest of the codes }



1
投票

@field:NotEmpty @field:NotNull @field:NotBlank(message = "Email is required") @field:Email(message = "Please provide a valid email") val email: String, @field:NotEmpty @field:NotNull @field:NotBlank(message = "Password is required") val password: String,

注意:

SNAPSHOT、M1、M2、M3 和 M4 版本通常正在进行中。 Spring 团队仍在研究它们,建议不要使用它们。


1
投票
pom.xml

文件中,并且 @NotBlank、@NotNull、@Valid 等应该可以正常工作。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>



0
投票

jackarta 更新后,您必须包含额外的配置才能使请求正文验证正常工作。 (即使没有额外的配置,现场验证也能正常工作)

最后我所需要的只是

<dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>2.0.2</version> </dependency>

@Configuration public class ValidationConfiguration { @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); } }

建议使用spring boot maven/gradle插件,这样就不会出现版本差异了


0
投票
通过添加

implementation 'org.springframework.boot:spring-boot-starter-validation'
依赖项并在字段上添加注释

spring-boot-starter-validation
(或
@field:NotBlank
@field:NotNull
)来解决。
    


-1
投票

© www.soinside.com 2019 - 2024. All rights reserved.