数据校验
前端的校验永远不可靠。
JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架
SR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean 进行验证。
Constraint | 详细信息 |
---|---|
@Null | 被注释的元素必须为 null |
@NotNull | 被注释的元素必须不为 null |
@AssertTrue | 被注释的元素必须为 true |
@AssertFalse | 被注释的元素必须为 false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max, min) | 被注释的元素的大小必须在指定的范围内 |
@Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator 附加的 constraint
Constraint | 详细信息 |
---|---|
@Email | 被注释的元素必须是电子邮箱地址 |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串的必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.20.Final</version>
</dependency>
实体类加注解:
public class User {
@Length(min = 2,max = 7,message = "长度不合法")
private String username;
private String password;
@Max(150)
private int age;
@Email
private String email;
}
参数非法异常类:
public class ParamIllegalException extends RuntimeException{
private Map<String,String> errors =new HashMap<>(4);
private int code;
private String msg;
public ParamIllegalException(ResultCode resultCode,Map<String,String> errors){
this.code=resultCode.getCode();
this.msg=resultCode.getMsg();
this.errors=errors;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public Map<String, String> getErrors() {
return errors;
}
}
全局异常处理类中加入参数异常处理器:
@ExceptionHandler(ParamIllegalException.class)
@ResponseBody //返回json,直接放到响应体中
public R paramIllegalException(ParamIllegalException e){
e.printStackTrace();
R r = R.of(e.getCode(), e.getMsg());
r.setOtherMsg(e.getErrors());
return r;
}
ResulitCode枚举中加入:
PARAM_ILLEGAL(10006, "jsr303验证参数不合法"),
controller:
@PostMapping("showUser")
@ResponseBody
public User showUser(@RequestBody @Validated User user ,BindingResult br) {
//若发生异常,吧异常信息放入BindingResult
List<ObjectError> allErrors = br.getAllErrors();
if(allErrors.size()>0){
Map<String,String> errors =new HashMap<>(4);
for (ObjectError allError : allErrors) {
String code= allError.getCode();
String msg= allError.getDefaultMessage();
errors.put(code,msg);
}
throw new ParamIllegalException(ResultCode.PARAM_ILLEGAL,errors);
}
System.out.println(user);
return user;
}
httpclient测试:
POST http://localhost:8080/user/showUser
Content-Type: application/json
{
"id": 999,
"username": "contentttttt",
"password": "1233",
"age": 160,
"email": "aa"
}
结果:
{
“code”: 10006,
“msg”: “jsr303验证参数不合法”,
“otherMsg”: {
“Max”: “最大不能超过150”,
“Length”: “长度不合法”,
“Email”: “不是一个合法的电子邮件地址”
}
}
处理资源,不走中央控制器
application.xml:
<mvc:resources mapping="/js/**" location="/static/js/"/>
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/img/**" location="/static/img/"/>