SpringBoot - jSR303校验的Message模板配置

本文介绍了如何在SpringBoot中使用JSR303进行参数校验,并自定义错误消息模板。通过创建`ValidationMessages.properties`文件配置错误信息,以及创建全局异常处理器来统一处理校验异常。同时,展示了如何创建自定义注解`@PasswordValid`,并配置模板参数,以增强参数校验的灵活性。示例中包含了测试用例及其结果。
摘要由CSDN通过智能技术生成

前言

jSR303参数校验可以查看之前的文章 SpringBoot - Bean validation 参数校验,这里介绍消息模板的配置。


具体实现

Message模板配置

  • /resources/目录下新增ValidationMessages.properties文件(固定文件名),配置Message
id.valid = id必须是正整数

在这里插入图片描述

  • 全局异常处理器
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolationException;

/**
 * @Description 全局异常统一处理
 * @author coisini
 * @date Aug 9, 2021
 * @Version 1.0
 */
@ControllerAdvice
public class GlobalExceptionAdvice1 {

    /**
     * 注解校验异常处理器
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(code= HttpStatus.BAD_REQUEST)
    @ResponseBody
    public UnifyMessage handleConstraintException(HttpServletRequest req, ConstraintViolationException e){
        String requestUrl = req.getRequestURI();
        String method = req.getMethod();
        String message = e.getMessage();

        return new UnifyMessage(10001, message, method + " " + requestUrl);
    }

}
  • 测试用例
@RestController
@RequestMapping("/vaild")
@Validated
public class ValidController {

    @GetMapping(value = "/test2/{id}")
    public Long test2(@PathVariable @Positive(message = "{id.valid}") Long id) {
        return id;
    }
    
}
  • 测试结果
    在这里插入图片描述
    在这里插入图片描述

模板参数配置

这里自定义一个密码校验注解

  • Password 校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * @Description Password 校验注解
 * @author coisini
 * @date Aug 17, 2021
 * @Version 1.0
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
@Constraint(validatedBy = PasswordValidator.class )
public @interface PasswordValid {
    String message() default "字段不符合要求";

    int min() default 6;

    int max() default 32;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
  • Password 校验关联类
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @Description Password 校验关联类
 * @author coisini
 * @date Aug 17, 2021
 * @Version 1.0
 */
public class PasswordValidValidator implements ConstraintValidator<PasswordValid, String> {

    private Integer min;
    private Integer max;

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

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if(StringUtils.isEmpty(s)){
            return true;
        }

        return s.length() >= this.min && s.length() <= this.max;
    }
}
  • 消息模板配置
user.password = password参数错误:当前值是${validatedValue};最大值应该是{max},最小值应该是{min}
  • 测试实体
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;

@Getter
@Setter
public class User {

    @NotBlank(message = "account不允许为空")
    private String account;

    @PasswordValid(max=30, message = "{user.password}")
    private String password;

}
  • 测试用例
@PostMapping(value = "/test3")
public void test3(@RequestBody @Validated User user) {

}
  • 测试结果

在这里插入图片描述


- End -
- 个人学习笔记 -
- 仅供参考 -

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maggieq8324

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值