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/
Cha*_*ith 28
添加以上答案,请看下面的内容.AppointmentForm的date专栏注释了几个注释.通过使用@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)
Mat*_*zyk 14
IIRC @Valid不是Spring注释,而是JSR-303注释(这是Bean Validation标准).它的作用是基本检查发送给方法的数据是否有效(它将为您验证scriptFile).
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).
我想添加更多关于如何@Valid工作的细节,尤其是在春天。
在https://reflectoring.io/bean-validation-with-spring-boot/ 中,你想知道的关于 spring 验证的所有内容都清楚详细地解释了,但我会复制@Valid链接的工作原理的答案下跌降落。
所述@Valid注释可以被添加到变量在静止控制器方法来验证他们。有 3 种类型的变量可以验证:
那么现在...... 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。
| 归档时间: |
|
| 查看次数: |
142502 次 |
| 最近记录: |