数据校验
在低版本的springboot中用的是hibernate validation
要导入对应hibernate依赖
但在高版本的springboot中,已经加入了validation的坐标
直接使用
<!-- hibernate 验证框架 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
使用方法:
1.在要使用的类属性上加入对应的注解
public class RegistLoginBO {
@NotBlank(message = "手机号不能为空")
@Length(min = 11, max = 11, message = "手机长度不正确")
private String mobile;
@NotBlank(message = "验证码不能为空")
private String smsCode;
}
2.在controller层中使用@Valid注解对要接收的对象进行验证,如果验证中有错误,会放在一个BindingResult 中,但是这样写对代码具有侵入性。
(1)
@PostMapping("login")
public GraceJSONResult login(@Valid @RequestBody RegistLoginBO registLoginBO,
// BindingResult result, // 对代码有侵入性
HttpServletRequest request) throws Exception {
// 0. 判断BindingResult中是否保存了错误的验证信息,如果有,则需要返回到前端
// if( result.hasErrors() ) {
// Map<String, String> map = getErrors(result);
// return GraceJSONResult.errorMap(map);
// }
}
public Map<String, String> getErrors(BindingResult result) {
Map<String, String> map = new HashMap<>();
List<FieldError> errorList = result.getFieldErrors();
for (FieldError ff : errorList) {
// 错误所对应的属性字段名
String field = ff.getField();
// 错误的信息
String msg = ff.getDefaultMessage();
map.put(field, msg);
}
return map;
}
(2)使用自定义异常处理解决侵入性,且解耦
MethodArgumentNotValidException.class 这是数据校验失败抛出的异常类
交给自定义异常处理返回给controller
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public GraceJSONResult returnMethodArgumentNotValid(MethodArgumentNotValidException e) {
BindingResult result = e.getBindingResult();
Map<String, String> map = getErrors(result);
return GraceJSONResult.errorMap(map);
}
8222

被折叠的 条评论
为什么被折叠?



