SpringBoot @Validated拓展 自定义参数校验

在Springboot中使用原生的@Validated进行参数校验时,只能对单独字段进行校验(例如字段长度、大小、不为空等),如果要对多字段进行组合的校验,这时候需要用到自定义的参数校验。
今天以校验password1与password2是否相同为例,讲解如何自定义参数校验。
涉及代码目录结构如下:
SpringBoot @Validated拓展 自定义参数校验_第1张图片
controller层是测试用的接口,GlobalExceptionAdvice获取参数异常,dto为需要校验参数的对象,validates下的两个文件用于处理异常参数的具体逻辑。
首先我们新建一个bean文件。

@Data
@PasswordEqual
public class UserDTO {

    private String password1;

    private String password2;
}

GlobalExceptionAdvice代码如下:

@ControllerAdvice
public class GlobalExceptionAdvice {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)   // 返回400响应码
    public UnifyResponse handleBeanValidation(HttpServletRequest reg, MethodArgumentNotValidException e){
        String reqUrl = reg.getRequestURI();
        String method = reg.getMethod();

        List errors = e.getBindingResult().getAllErrors();
        String message = formatAllErrorMessages(errors);
        return new UnifyResponse(10001, message, method + " " + reqUrl);
    }
	
	// 拼接报错信息
    private String formatAllErrorMessages(List errors){
        StringBuffer errorMsgs = new StringBuffer();
        errors.forEach(error -> errorMsgs.append(error.getDefaultMessage()).append(";"));
        return errorMsgs.toString();
    }
}

PasswordEqual

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
	
	// 校验未通过时的返回信息
    String message() default "passwords are not equal";

	// 以下两行为固定模板
    Class[] groups() default {};
    Class[] payload() default {};

}

PasswordValidator

public class PasswordValidator implements ConstraintValidator {

    @Override
    public boolean isValid(UserDTO userDTO, ConstraintValidatorContext constraintValidatorContext) {
        String password1 = userDTO.getPassword1();
        String password2 = userDTO.getPassword2();
        // 这里只是做示例用,所以简单实用了equals进行对比,实际使用可以根据业务要求做更多拓展
        boolean match = password1.equals(password2);
        return match;
    }
}

测试可以看到,如果传入参数password1与password2不相同,会返回我们自定义的响应内容。
SpringBoot @Validated拓展 自定义参数校验_第2张图片
这里的message内容是我们配置的默认信息,如果想修改message内容,可以在DTO层使用@PasswordEqual时,传入message内容,例如@PasswordEqual(message=“两次输入密码不相同”)
SpringBoot @Validated拓展 自定义参数校验_第3张图片
SpringBoot @Validated拓展 自定义参数校验_第4张图片

你可能感兴趣的:(SpringBoot)