需要引入依赖spring-boot-starter-validation

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-validation</artifactId>
    4. </dependency>

    校验可以使用的部分注解

    验证注解 说明
    @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格式

    下面是validation的简单用法

    定义接口

    1. import org.springframework.validation.BindingResult;
    2. import org.springframework.validation.annotation.Validated;
    3. import org.springframework.web.bind.annotation.*;
    4. import privs.nb.demo.param.Test;
    5. import privs.nb.demo.response.ResponseData;
    6. import javax.validation.Valid;
    7. import javax.validation.constraints.Max;
    8. /**
    9. * @author niubi
    10. */
    11. @Validated
    12. @RestController
    13. @RequestMapping("/valid")
    14. public class ValidApi {
    15. /**
    16. * 校验实体属性
    17. * Test为一个嵌套实体
    18. * 校验实体时,实体后必须紧跟BindingResult
    19. * @param param .
    20. * @param bindingResult .
    21. * @return .
    22. */
    23. @PostMapping("/entity")
    24. @ResponseBody
    25. public ResponseData<String> validEntity(@Valid @RequestBody Test param, BindingResult bindingResult){
    26. return ResponseData.ok("success");
    27. }
    28. /**
    29. * 校验param
    30. * @param id .
    31. * @return .
    32. */
    33. @GetMapping("/params")
    34. @ResponseBody
    35. public ResponseData<String> validParams(@Max(value = 5, message = "max") @RequestParam Integer id){
    36. return ResponseData.ok("success");
    37. }
    38. /**
    39. * 校验路径参数
    40. * @param id .
    41. * @return .
    42. */
    43. @GetMapping("/pathVar/{id}")
    44. @ResponseBody
    45. public ResponseData<String> validPathVar(@Validated @Max(value = 5, message = "max") @PathVariable(name = "id") Integer id){
    46. return ResponseData.ok("success");
    47. }
    48. /**
    49. * 使用自定义校验器
    50. * @param name .
    51. * @return .
    52. */
    53. @GetMapping("/custom")
    54. @ResponseBody
    55. public ResponseData<String> validWithTest(@privs.nb.demo.ann.Test(message = "不是tom") @RequestParam(name = "name") String name){
    56. return ResponseData.ok("success");
    57. }
    58. }

    需注意:
    1 .校验实体时,实体后必须紧跟BindingResult而其他的不需要
    2 .@Validated注解可以位于校验参数上,方法上,类上,但校验实体需使用@Valid

    下面是接口中用到的注解及校验实体的定义
    定义全局异常处理类

    1. @ControllerAdvice
    2. @Slf4j
    3. public class GlobalExceptionHandler {
    4. @ExceptionHandler(value = ConstraintViolationException.class)
    5. @ResponseBody
    6. public ResponseData<String> errorHandler(ConstraintViolationException ex) {
    7. for (ConstraintViolation<?> constraintViolation : ex.getConstraintViolations()) {
    8. return ResponseData.error(constraintViolation.getMessage());
    9. }
    10. return ResponseData.error(ex.getMessage());
    11. }
    12. }

    自定义校验器

    1. // 注解
    2. @Target({ElementType.METHOD,ElementType.FIELD, ElementType.PARAMETER})
    3. @Retention(RetentionPolicy.RUNTIME)
    4. @Constraint(validatedBy = TestValidator.class)
    5. public @interface Test {
    6. String message() ;
    7. Class<?>[] groups() default { };
    8. Class<? extends Payload>[] payload() default { };
    9. }
    10. // 注解实现类
    11. @Slf4j
    12. public class TestValidator implements ConstraintValidator<Test, Object> {
    13. @Override
    14. public void initialize(Test constraintAnnotation) {
    15. log.info("校验器初始化");
    16. }
    17. @Override
    18. public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
    19. String name = (String)o;
    20. if ("tom".equals(name)) {
    21. return true;
    22. }
    23. System.out.println(o);
    24. return false;
    25. }
    26. }

    定义校验实体

    1. @Data
    2. public class Test {
    3. @NotNull(message = "id不能为空")
    4. private String id;
    5. @Min(message = "age必须大于0", value = 0)
    6. private int age;
    7. @Valid
    8. @NotNull(message = "in不能为空")
    9. private TestIn in;
    10. }
    11. @Data
    12. public class TestIn {
    13. @Test(message = "不是tom")
    14. private String name;
    15. }