@Valid注释在Spring中表示什么?

Gar*_*ord 70 java spring spring-mvc spring-annotations

在以下示例中,ScriptFile参数标有@Valid注释.

是什么@Valid注解吗?

@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)    
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {    
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");        
    if (result.hasErrors()) {        
        modelMap.addAttribute("scriptFile", scriptFile);            
        modelMap.addAttribute("showcases", ShowCase.findAllShowCases());            
        return "scriptfile/create";            
    }        
    scriptFile.persist();        
    return "redirect:/scriptfile/" + scriptFile.getId();        
}    
Run Code Online (Sandbox Code Playgroud)

mhs*_*ams 57

这是为了验证目的.

验证通常在将用户输入绑定到模型之后验证模型.Spring 3为JSR-303的声明性验证提供支持.如果类路径中存在JSR-303提供程序(如Hibernate Validator),则会自动启用此支持.启用后,只需使用@Valid注释注释Controller方法参数即可触发验证:绑定传入的POST参数后,将验证AppointmentForm; 在这种情况下,要验证日期字段值不为空并且将来发生.


在这里查看更多信息:http:
//blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

  • 长话短说,在您的特定示例代码中,“ScriptFile”类为类数据成员定义了一些约束,例如“@NotNull”、“@NotEmpty”等,并且“@Valid”指示框架(spring in我们的案例)来根据有人调用您的方法时提供的参数检查这些约束。在这种情况下,如果验证失败,服务器将返回“HTTP 400 Bad Request”状态代码。 (14认同)

Cha*_*ith 28

添加以上答案,请看下面的内容.AppointmentFormdate专栏注释了几个注释.通过使用@Valid注释触发AppointmentForm(在这种情况下@NotNull@Future)的验证.这些注释可能来自不同的JSR-303提供程序(例如,Hibernate,Spring ..等).

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }
Run Code Online (Sandbox Code Playgroud)

  • 我有一个类似的代码。我已经删除了 `ApplicationForm` 参数上的 `@Valid`,但是,仍然在 `date`(设置为 `null`)字段上触发了验证。请解释。 (2认同)

Mat*_*zyk 14

IIRC @Valid不是Spring注释,而是JSR-303注释(这是Bean Validation标准).它的作用是基本检查发送给方法的数据是否有效(它将为您验证scriptFile).

  • “它将为您验证 scriptFile”是什么意思?检查它不为空,它有一些语法,还是一些内容?换句话说,它验证什么以及如何验证?用户应该实施一些措施吗?我在哪里可以得到相关信息?谢谢你! (3认同)
  • 请回答@nephewtom的问题,这不足以验证缺少的要点“反对什么”? (2认同)

yur*_*s87 13

@Valid本身与Spring无关.它是Bean Validation规范的一部分(其中有几个,最新的一个是JSR 380,截至2017年下半年),但是@Valid很老,并且从JSR 303开始.

众所周知,Spring非常擅长提供与所有不同的JSR和Java库的集成(想想JPA,JTA,Caching等),当然这些人也负责验证.促进这一点的关键组件之一是MethodValidationPostProcessor.

试图回答您的问题 - @Valid当您想要验证复杂图形而不仅仅是对象的顶级元素时,所谓的验证级联非常方便.每次你想要更深入,你必须使用@Valid.这就是JSR所要求的.Spring会遵循一些小的偏差(例如我尝试使用@Validated而不是@Valid使用RestController方法和验证工作,但同样不适用于常规的"服务"bean).

  • 但是,什么可以验证呢? (2认同)

Ali*_*zan 7

我想添加更多关于如何@Valid工作的细节,尤其是在春天。

https://reflectoring.io/bean-validation-with-spring-boot/ 中,你想知道的关于 spring 验证的所有内容都清楚详细地解释了,但我会复制@Valid链接的工作原理的答案下跌降落。

所述@Valid注释可以被添加到变量在静止控制器方法来验证他们。有 3 种类型的变量可以验证:

  • 请求正文,
  • 路径中的变量(例如 /foos/{id} 中的 id)和,
  • 查询参数。

那么现在...... spring 如何“验证”?您可以通过使用某些注释对类的字段进行注释来定义对类字段的约束。然后,您将该类的一个对象传递给一个 Validator,它检查是否满足约束。

例如,假设我有这样的控制器方法:

@RestController
class ValidateRequestBodyController {

  @PostMapping("/validateBody")
  ResponseEntity<String> validateBody(@Valid @RequestBody Input input) {
    return ResponseEntity.ok("valid");
  }

}
Run Code Online (Sandbox Code Playgroud)

所以这是一个 POST 请求,它接收一个请求体,我们将该请求体映射到一个 class Input

这是课程Input

class Input {

  @Min(1)
  @Max(10)
  private int numberBetweenOneAndTen;

  @Pattern(regexp = "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$")
  private String ipAddress;
  
  // ...
}
Run Code Online (Sandbox Code Playgroud)

@Valid 注释会告诉 spring 去验证传入控制器的数据,numberBetweenOneAndTen因为这些最小和最大注释会检查整数是否在 1 到 10 之间。它还会检查以确保传入的 ip 地址与注释中的正则表达式匹配。

旁注:正则表达式并不完美……你可以传入大于 255 的 3 位数字,它仍然会匹配正则表达式。


这是验证查询变量和路径变量的示例:

@RestController
@Validated
class ValidateParametersController {

  @GetMapping("/validatePathVariable/{id}")
  ResponseEntity<String> validatePathVariable(
      @PathVariable("id") @Min(5) int id) {
    return ResponseEntity.ok("valid");
  }
  
  @GetMapping("/validateRequestParameter")
  ResponseEntity<String> validateRequestParameter(
      @RequestParam("param") @Min(5) int param) { 
    return ResponseEntity.ok("valid");
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于查询变量和路径变量只是整数而不是复杂的类,因此我们将约束注释@Min(5)放在参数上,而不是使用@Valid