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")
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) {
String message = e.getAllErrors().get(0).getDefaultMessage();
MemberCodeMsg memberCodeMsg = MemberCodeMsg.PARAM_OPT;
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) {
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()方法
public static final MemberCodeMsg PARAM_OPT=new MemberCodeMsg(50103,"参数异常信息:{0}");
MemberCodeMsg memberCodeMsg = MemberCodeMsg.PARAM_OPT
memberCodeMsg.setMsg(MessageFormat.format(memberCodeMsg.getMsg(),"手机号码格式不正确"));
memberCodeMsg.getMsg()="参数异常信息:手机号码格式不正确"
五.JSR303参数校验常用注解
@NotNull 注解元素必须是非空
@Null 注解元素必须是空
@Digits 验证数字构成是否合法
@Future 验证是否在当前系统时间之后
@Past 验证是否在当前系统时间之前
@Max 验证值是否小于等于最大指定整数值
@Min 验证值是否大于等于最小指定整数值
@Pattern 验证字符串是否匹配指定的正则表达式
@Size 验证元素大小是否在指定范围内
@DecimalMax 验证值是否小于等于最大指定小数值
@DecimalMin 验证值是否大于等于最小指定小数值
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
六.JSR303参数校验小结
第一步:在封装类中对应的字段贴上注解并写上错误信息
private String username;
第二步:在controller类中方法中的参数贴@Valid注解,注意一点要贴,否则不起作用
第三步:在增强控制器中捕获BindException异常
第四步:获取错误信息,即我们直接写的错误信息
第五步:使用MessageFormat.format(带有占位符的信息,我们自己写的错误信息)这个方法,
可以使用占位符,对应封装不同的错误信息