栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+JSR303(springboot 403)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+JSR303(springboot 403)

SpringBoot+JSR303 依赖引入

    org.springframework.boot
    spring-boot-starter-validation

框架自带校验

entity设置

@Data
@Builder
public class Employee implements Serializable {
    public interface Operation {}
    public interface Query extends Operation{}
    public interface Update extends Operation{}
    public interface Save extends Operation{}
    public interface Delete extends Operation{}
    //激活子父也会激活,激活父不会激活子
    @Range(min = 0L,max = 1000L,groups = {Operation.class})
    @NotNull(groups = {Query.class})
    private Integer id;
}

controller设置

    @PostMapping("/employee")
    public String getEmployee(@RequestBody @Validated(Employee.Operation.class) Employee employee, BindingResult bindingResult) {
        if (bindingResult.hasErrors()){
            List allErrors = bindingResult.getFieldErrors();
            String error = "";
            for (FieldError fieldError : allErrors) {
                error += fieldError.getObjectName()+fieldError.getField()+fieldError.getDefaultMessage();
            }
            return error;
        }
        List employees = employeeService.selectByExample(employee);
        return employees.toString();
    }

通用校验异常

class A {}

自定义校验类

@documented
//注解使用的校验器
@Constraint(
        validatedBy = {Agevalidator.class}
)
@SupportedValidationTarget({ValidationTarget.ANNOTATED_ELEMENT})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@ReportAsSingleViolation
public @interface Age {

    int min() default 0;

    int max() default 125;
	//{max}用来获取参数值
    String message() default "年龄是非法的,最大不能超过{max}岁,最小不能小于{min}岁";

    Class[] groups() default {};

    Class[] payload() default {};
}
public class Agevalidator implements ConstraintValidator {

    private Integer max;
    private Integer min;

    @Override
    public void initialize(Age constraintAnnotation) {
       this.max = constraintAnnotation.max();
       this.min = constraintAnnotation.min();
    }

    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        return integer != null && integer < max && min < integer;
    }
}

配置全局异常捕获参数校验错误

配置全局异常类

//包路径不能写表达式 *.**.controller
@RestControllerAdvice(basePackages = "com.miracle.springdemo.controller")
public class ValidatorErrorControllerAdvice {
    @ExceptionHandler(value = {MethodArgumentNotValidException.class,BindException.class})
    //入参可以是request对象
    public Map defaultValidatorErrorHandle(Exception exception) {
        BindingResult bindingResult;
        if (exception instanceof MethodArgumentNotValidException) {
            bindingResult = ((MethodArgumentNotValidException)exception).getBindingResult();
        }else {
            bindingResult = ((BindException)exception).getBindingResult();
        }
        Map result = new HashMap<>(16);
        result.put("对象名称", bindingResult.getObjectName());
        bindingResult.getFieldErrors().forEach(fieldError -> {
            result.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        result.put("status","400");
        return result;
    }
}

校验类编写

//BindingResult bindingResult对象不用添加在参数列表会直接抛出异常,通过全局异常捕获即可    
@PostMapping("/employee")
    public String getEmployee(@RequestBody @Validated(Employee.Query.class) Employee employee) {
        List employees = employeeService.selectByExample(employee);
        return employees.toString();
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号