总原则:
@Validated:
1,"模型参数"必须处于参数前才能生效
2,"非模型参数"必须处于类上才能生效
@Valid:
1,用法和@Validated一样
2,嵌套验证将@Valid添加到实体字段前, 而且必须与@Requestbody配合, 并且需要通过@Valid或者@Validated才能触发验证
如果后面有BindingResult参数,即使有全局异常也不会触发, 其将会把所有参数验证异常在BindingResult中体现
@PostMapping("/login")
public String login(@RequestBody @Valid LoginCommand loginCommand, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return bindingResult.getAllErrors().get(0).getDefaultMessage();
}
return "success";
}
如果是基础类型一定要将@Validated或者 @Valid加在类上才会触发, 并且BindingResult 不能加在基础类型参数后
@GetMapping("/sendCode/{mobile}")
public void sendCode(@PathVariable @Pattern(regexp = "^1\\d{10}$", message = "手机号格式有误") String mobile) {
System.out.println(2232);
}
如果是实体验证必须将@Validated或者 @Valid加在参数前才会触发
@PostMapping("/save")
public String save(@RequestBody @Valid UserCommand userCommand) {
return "success";
}
嵌套验证必须将@Valid加载成员属性上如果不为空还需要加其他注解,再配合上述关于实体类验证
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserCommand {
@NotBlank(message = "名称不能为空")
private String name;
private Integer age;
@Valid
@NotNull(message = "用户详情不能为空")
private UserDetailCommand userDetailCommand;
}
网友评论