Spring Boot验证注释@Valid和@notblank不起作用



下面给出的是我的主要控制器

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

我试图通过右键单击项目(运行AS(并传递变量的空白值 ISREPRINT and includeignatureCoorDinates 通过SOAP通过SOAP,我正在尝试将应用程序作为春季启动应用程序运行UI。但是,该验证似乎不起作用,也没有在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版本中

在这里检查注释

因此,您要做的就是在build.gradle/pom file

中添加此依赖项

gradle:

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

maven

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

我面临相同的错误。

我必须仅使用以下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注释(import org.springframework.validation.annotation.validation.validation(在REST控制器级别和方法参数级别的@Valid注释(import Javax.validation.valid.valid(

如果还有其他额外的依赖项,例如javax.validation.validation-apiorg.hibernate.hibernate-validator等,那么验证效果停止为我工作。因此,请确保从pom.xml

首先从pom.xml

首先,您不需要在UpdatePrintContract中对这些类变量进行@VALID注释。您可以删除它们。

要触发@controller输入的验证,只需注释输入参数为@valid或@validated:

@RequestMapping(value=PATH_PRINT_CONTRACTS, method=RequestMethod.POST)
public ResponseEntity<?> printContracts(@Valid @RequestBody  final UpdatePrintContracts updatePrintContracts) throws Exception {

请参阅此处的全面了解春季启动中的验证模型。

并且,如果要检查字符串仅包含特定字符,则必须添加锚点(^为String的启动,字符串的末端$(以确保您的tatter与所有字符串匹配。仅写数量,

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

最后,我认为您在类Path中有关注罐子,

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

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

i在春季启动中使用这种验证的依赖性,并且不起作用,

<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>

我用弹簧启动器验证替换了它,它起作用了。

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

这是针对此处遵循上述步骤后仍然存在相同问题的任何人。我必须重新启动我的IDE(Intellij(才能生效。

请确保在@requestbody

之前先使用@Valid注释

对于较新版本的春季启动,请确保从jakarta.validation.*软件包而不是javax.validation.*选择所有验证注释。由于注释在这两个中都命名相同。

我解决了我的问题。当我们使用类也需要验证的类中的类时,因此在这种情况下需要注释@Valid。链接以获取更多详细信息

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>

step-2:创建一个自定义异常类

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

步骤3:将@Valid注释添加到这样的方法参数

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

如果您使用的是弹簧版&gt;3

使用kotlin,您应该添加@field:注释

ex:

@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,

您必须在pom.xml

中添加此依赖项
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

注意:快照,M1,M2,M3和M4释放通常正在进行中。春季团队仍在处理他们,建议不要使用它们。

将此依赖项添加到您的 pom.xml 文件和 @notblank,@notnull,@valid 等。应该正常工作。

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

对于像我这样的任何人使用Spring Boot 3.x。

jackarta更新后,您必须包括额外的配置,以便请求车身验证才能正常工作。(即使没有额外的配置,字段验证也可以正常工作(

最后我需要的只是

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

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

建议使用Spring Boot Maven/gradle插件,因此没有版本差异

我的Kotlin Spring Boot中的实体相同的问题.x应用程序。
通过在字段上添加 spring-boot-starter-validation依赖关系并添加氧气 @field:NotBlank(或 @field:NotNull@field:NotEmpty(来解决。

我也有相同的问题对我添加:

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

在弹簧引导 - 启动依赖性问题下解决了问题。为了确保您应该直接生成依赖性,并使用验证表格开始弹簧io。值得一提的是,pom文件中的依赖依赖顺序至关重要

您可以使用@notempty会检查空白和null值。将@valid添加到您的RESTCONTOLLER类方法

最新更新