Spring 引导验证注释 @Valid 和 @NotBlank 不起作用

新手上路,请多包涵

下面给出的是我调用 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 为变量 isReprintincludeSignatureCoordinates 传递空白值来将应用程序作为 Spring Boot 应用程序运行。但是,验证似乎不起作用,并且不会在 Soap UI 中抛出任何验证错误。我错过了什么?任何帮助表示赞赏!

原文由 Poonkodi Sivapragasam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

首先,您不需要为 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(包含具体实现)

原文由 surya 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Deb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题