JSR303参数校验

JSR303参数校验

一.JSR303是什么?
	JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,
	我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。
二.业务模块 member-server
封装类(添加限制条件)
@Getter
@Setter
public class LoginVo {
    //使用注解,限制条件,并规定错误信息
    @Pattern(regexp = "1[345678]\\d{9}",message = "手机号码格式不正确")
    private String username;
    @NotEmpty(message = "密码不能为空")
    private String password;
}
controller(@Valid注解)
@RestController
public class UserController {
     @Autowired
    private IUserService userService;
       @RequestMapping("/doLogin")
    //注意使用参数校验时,需要贴@Valid注解
    public Result doLogin(@Valid LoginVo loginVo) {
       String token= userService.doLogin(loginVo);
    }
}
统一异常处理
@ControllerAdvice
public class MemberControllerAdvice extends CommonControllerAdvice {

    @ExceptionHandler(BindException.class)
    @ResponseBody
    public Result hanlderParam(BindException e) {
        //@Pattern(regexp = "1[345678]\\d{9}",message = "手机号码格式不正确")
        //获取javabean封装类中注解上面的message内容
        String message = e.getAllErrors().get(0).getDefaultMessage();
        MemberCodeMsg memberCodeMsg = MemberCodeMsg.PARAM_OPT;
        //memberCodeMsg.setMsg(MessageFormat.format(memberCodeMsg.getMsg(), message));
        return Result.error(memberCodeMsg.format(message)); //下面写了具体的方法
    }
}
MemberCodeMsg类
@Getter
@Setter
public class MemberCodeMsg extends CodeMsg {
    public static final  MemberCodeMsg PARAM_OPT=new MemberCodeMsg(50103,"参数异常信息:{0}");

    public MemberCodeMsg(int code, String msg) {
        super(code, msg);
    }
    public MemberCodeMsg() {
    }
    public MemberCodeMsg format(String ...args) {
//因为{0}占位符在第一次替换后就没有了,就会变成一个固定的值,为了避免这种情况,我们可以每次都创建一个新的对象
        MemberCodeMsg memberCodeMsg=new MemberCodeMsg();
        memberCodeMsg.setCode(this.getCode());
        memberCodeMsg.setMsg(MessageFormat.format(this.getMsg(),args));
        return memberCodeMsg;
    }
}
三.公共模块shop-common
1.异常后返回给前端的封装类
@Setter
@Getter
public class CodeMsg implements Serializable {
    private int code;  //状态码
    private String msg;  //异常信息或成功信息

    public CodeMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public CodeMsg(){
    }
}
2.自定义异常
@Getter
@Setter
public class BusinessException extends RuntimeException {

    private CodeMsg codeMsg;

    public BusinessException(CodeMsg codeMsg) {
        this.codeMsg = codeMsg;
    }
    public BusinessException() {
    }
}
3.异常捕获,自身不贴增强控制器注解,其他模块需要抛异常时,直接继承这个类即可
public class CommonControllerAdvice {
	//捕获自定义异常
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public Result handler(BusinessException e) {
        e.printStackTrace();
        e.getMessage();
        return Result.error(e.getCodeMsg());
    }
	//捕获其他系统异常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result hanlderDefaultException(Exception e) {
        e.printStackTrace();
        return Result.defaultError();
    }
}
4.返回给前端的统一类
@Setter
@Getter
public class Result<T> implements Serializable {
    public static final int SUCCESS_CODE = 200;
    public static final String SUCCESS_MESSAGE = "操作成功";
    public static final int ERROR_CODE = 500;
    public static final String ERROR_MESSAGE = "系统故障";
    
    private int code;
    private String msg;
    private T data;

    public Result() {
    }
    private Result(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public static <T>Result<T> success(T data){
        return new Result<>(SUCCESS_CODE,SUCCESS_MESSAGE,data);
    }
    public static Result error(CodeMsg codeMsg){
        return new Result(codeMsg.getCode(),codeMsg.getMsg(),null);
    }
    public static Result defaultError(){
        return new Result(ERROR_CODE,ERROR_MESSAGE,null);
    }
}
需要导入的依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
四.关于MessageFormat.format()方法
//使用MessageFormat.format()方法前
public static final  MemberCodeMsg PARAM_OPT=new MemberCodeMsg(50103,"参数异常信息:{0}");
//使用MessageFormat.format()方法
MemberCodeMsg memberCodeMsg = MemberCodeMsg.PARAM_OPT
memberCodeMsg.setMsg(MessageFormat.format(memberCodeMsg.getMsg(),"手机号码格式不正确"));
//得到结果
memberCodeMsg.getMsg()="参数异常信息:手机号码格式不正确"
//可以看出MessageFormat.format方法就是将使用占位符的数据替换为另一个数据
五.JSR303参数校验常用注解
@NotNull    	注解元素必须是非空
@Null       	注解元素必须是空
@Digits     	验证数字构成是否合法
@Future     	验证是否在当前系统时间之后
@Past       	验证是否在当前系统时间之前
@Max        	验证值是否小于等于最大指定整数值
@Min        	验证值是否大于等于最小指定整数值
@Pattern    	验证字符串是否匹配指定的正则表达式
@Size       	验证元素大小是否在指定范围内
@DecimalMax  	验证值是否小于等于最大指定小数值
@DecimalMin 	验证值是否大于等于最小指定小数值
@AssertTrue		被注释的元素必须为true
@AssertFalse	被注释的元素必须为false
六.JSR303参数校验小结
第一步:在封装类中对应的字段贴上注解并写上错误信息
//例: @Pattern(regexp = "1[345678]\\d{9}",message = "手机号码格式不正确")
   private String username;
第二步:在controller类中方法中的参数贴@Valid注解,注意一点要贴,否则不起作用
第三步:在增强控制器中捕获BindException异常
第四步:获取错误信息,即我们直接写的错误信息
//  String message = e.getAllErrors().get(0).getDefaultMessage();
第五步:使用MessageFormat.format(带有占位符的信息,我们自己写的错误信息)这个方法,
      可以使用占位符,对应封装不同的错误信息
//MessageFormat.format()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值