@Validated和@Valid用法与区别

1、@Validated和@Valid用法与区别

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能

下面注解可以在实体类字段上面定义:

限制   说明
@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格式

自己封装全局异常类

package com.example.apps.advice;

import com.example.apps.result.ServiceResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.Set;

@RestControllerAdvice
public class GlobalControllerAdvice {

    @ExceptionHandler(value = ConstraintViolationException.class)
    public ServiceResult errorHandler(ConstraintViolationException ex) {
        ServiceResult serviceResult = new ServiceResult(400);
        Set> constraintViolations = ex.getConstraintViolations();
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            StringBuilder stringBuilder = new StringBuilder();
            for (ConstraintViolation constraintViolation : constraintViolations) {
                stringBuilder.append(constraintViolation.getMessage()).append(",");
            }
            String errorMessage = stringBuilder.toString();
            if (errorMessage.length() > 1) {
                errorMessage = StringUtils.removeEnd(errorMessage, ",");
                serviceResult.setMessage(errorMessage);
                return serviceResult;
            }
        }
        serviceResult.setMessage(ex.getMessage());
        return serviceResult;
    }


    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ServiceResult errorHandler(MethodArgumentNotValidException ex) {
        ServiceResult serviceResult = new ServiceResult(400);
        List objectErrors = ex.getBindingResult().getAllErrors();
        if(!CollectionUtils.isEmpty(objectErrors)) {
            StringBuilder builder = new StringBuilder();
            for (ObjectError objectError : objectErrors) {
                builder.append(objectError.getDefaultMessage()).append(",");
            }
            String errorMessage = builder.toString();
            if (errorMessage.length() > 1) {
                errorMessage = StringUtils.removeEnd(errorMessage,",");
            }
            serviceResult.setMessage(errorMessage);
            return serviceResult;
        }
        serviceResult.setMessage(ex.getMessage());
        return serviceResult;
    }
}

实体类User

package com.example.apps.entity;

import lombok.Builder;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class User {

    @NotNull(message = "id不能为空")
    private Integer id;
    @Size(min = 1,max = 20,message = "登录名长度必须在1到20之间")
    private String username;
    private String password;
    @Size(min = 1,max = 50,message = "姓名长度必须在1到50之间")
    private String name;
    @Max(value = 120,message = "最大年龄小于120岁")
    private String age;

    @Valid
    private Clazz clazz;

}

实体类Clazz

package com.example.apps.entity;

import lombok.Data;

import javax.validation.constraints.*;

@Data
public class Clazz {
    @NotNull(message = "班级主键ID不能为空")
    private Integer id;
    @NotBlank(message = "班级名称不能为空")
    @Size(min = 1,max = 50,message = "班级名称长度必须在1到50之间")
    private String className;
}

 测试controller

package com.example.apps.controller;

import com.example.apps.entity.Clazz;
import com.example.apps.entity.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("/user")
public class ValidatorController {


    @PostMapping("/addUser")
    public User addUser(@Valid @RequestBody User user){
        System.out.println(user);
        return user;
    }

    @PostMapping("/addClazz")
    public Clazz addClazz(@Validated @RequestBody Clazz clazz){
        System.out.println(clazz);
        return clazz;
    }

}

 

你可能感兴趣的:(@Validated和@Valid用法与区别)