小熙最近看项目,遇到不少之前没有用过的注解,特此查找大佬们的心得记录下,并与大家共享。
例子一:
①: 用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
@RestController @RequestMapping("/user") public class UserController { @PostMapping public User create (@Valid @RequestBody User user) { System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword()); user.setId("1"); return user; } }② : 然后在 User 类中添加验证信息的要求:
public class User { private String id; @NotBlank(message = "密码不能为空") private String password; }@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。
例子二:
①: 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性):
@Min(value = 18,message = "年龄不合法") private Integer age;② : 其次在controller层的方法的要校验的参数上添加@Valid注解,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:
@PostMapping("/users") public User addUser(@RequestBody @Valid User user, BindingResult bindingResult) { if(bindingResult.hasErrors()){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return null; } return userResposity.save(user); }bindingResult.getFieldError.getDefaultMessage()用于获取相应字段上添加的message中的内容,如:@Min注解中message属性的内容
当然也可以添加其他验证信息的要求:
限制说明@Null限制只能为null@NotNull限制必须不为null@AssertFalse限制必须为false@AssertTrue限制必须为true@DecimalMax(value)限制必须为一个不大于指定值的数字@DecimalMin(value)限制必须为一个不小于指定值的数字@Digits(integer,fraction)限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction@Future限制必须是一个将来的日期@Max(value)限制必须为一个不大于指定值的数字@Min(value)限制必须为一个不小于指定值的数字@Past限制必须是一个过去的日期@Pattern(value)限制必须符合指定的正则表达式@Size(max,min)限制字符长度必须在min到max之间@Past验证注解的元素值(日期类型)比当前时间早@NotEmpty验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)@NotBlank验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格@Email验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式除此之外还可以自定义验证信息的要求,例如下面的 @MyConstraint:
public class User { private String id; @MyConstraint(message = "这是一个测试") private String username; }注解的具体内容:
@Constraint(validatedBy = {MyConstraintValidator.class}) @Target({ELementtype.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface MyConstraint { String message(); Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }下面是校验器:
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> { @Autowired private UserService userService; @Override public void initialie(@MyConstraint constarintAnnotation) { System.out.println("my validator init"); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) { userService.getUserByUsername("seina"); System.out.println("valid"); return false; } }