@Valid 数据校验 + 自定义全局异常信息
2023-09-27 14:24:01 时间
关于javax.validation.Validator校验的使用
- 对于要校验的实体类:其需要校验的字段上需要添加注解
实际例子
使用:首先要拿到 validator的子类
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
其中方法可以参考 API
对实体类的校验
Set<ConstraintViolation<Object>> set = validator.validate(obj,Default.class);
本文链接:https://blog.csdn.net/qq_38193966/article/details/95990268
————————————————
@Valid 数据校验 + 自定义全局异常信息
我们常用@Valid做数据校验,比如现在前端要新增一个用户,我们可以这样校验:
@RestController
public class UserController {
@PostMapping("/user")
public void addUser(@RequestBody @Valid RequestDTO requestDTO){
//其余业务处理
System.out.println(requestDTO.toString());
}
}
传入的数据规则如下列代码所示:
@Data
public class RequestDTO {
@NotNull(message = "名字不能为空")
String name;
@NotEmpty(message = "密码不能为空")
String password;
@Override
public String toString() {
return "name=" + name + ",password=" + password;
}
}
假设我们模仿前端伪造了一个非法数据(例如密码为空):
{
"name": "string",
"password": ""
}
加了@Valid注解的程序就能按我们的预期报错:
{
"timestamp": "2019-08-26T14:12:02.542+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotEmpty.requestDTO.password",
"NotEmpty.password",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"requestDTO.password",
"password"
],
"arguments": null,
"defaultMessage": "password",
"code": "password"
}
],
"defaultMessage": "密码不能为空",
"objectName": "requestDTO",
"field": "password",
"rejectedValue": "",
"bindingFailure": false,
"code": "NotEmpty"
}
],
"message": "Validation failed for object='requestDTO'. Error count: 1",
"path": "/user"
}
报错信息改进
但这样的报错信息明显太冗余了,我们想简化下,只抛出有问题字段的报错信息,这回就可以结合我们的全局异常进行处理:
1.编写自定义异常处理类,绑定要处理的异常
这里我们注意到@Valid抛出的异常类是MethodArgumentNotValidException ,所以我们将捕获该异常,并对它重新自定义异常信息
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseBody
public JsonResult MyExceptionHandle(MethodArgumentNotValidException exception){
exception.printStackTrace();
BindingResult result = exception.getBindingResult();
StringBuilder errorMsg = new StringBuilder() ;
if (result.hasErrors()) {
List<FieldError> fieldErrors = result.getFieldErrors();
fieldErrors.forEach(error -> {
System.out.println("field" + error.getField() + ", msg:" + error.getDefaultMessage());
errorMsg.append(error.getDefaultMessage()).append("!");
});
}
exception.printStackTrace();
return new JsonResult(-1,errorMsg.toString() );
}
}
上面的代码就是取出里面的报错信息,组装成自己需要显示的信息(这里我们封装成一个json结构,包括状态码和信息返出去):
- 试验成果
将刚刚的请求再发一遍,现在就可以看到,错误信息已经按照我们规定的格式返回了:
{
"code": -1,
"msg": "密码不能为空!"
}
相关文章
- springboot全局捕获异常
- WCF学习之旅—基于ServiceDebug的异常处理(十七)
- c#基础之异常处理及自定义异常 从SQLServer转储数据到MySQL
- Google Earth Engine——NASA-USDA增强型SMAP全球土壤水分数据以10公里的空间分辨率提供全球的土壤水分信息。包括:地表和地下土壤湿度(毫米)和异常,土壤湿度剖面(%)
- Google Earth Engine——GRACE Tellus月度质量网格提供了相对于2004-2010年时间平均基线的月度引力异常值。该数据集所包含的数据是以 “等水厚度 “为单位,以厘米为单位
- Google Earth Engine——2004-2010年时间平均基线的月度引力异常值,该数据集所包含的数据是以 “等水厚度 “为单位,以厘米为单位表示水的垂直范围的质量偏差
- 异常处理__try{}__except(EXCEPTION_EXECUTE_HANDLER){}
- Elasticsearch 用机器学习实现时序数据的异常检测(下)
- Elasticsearch 用机器学习实现时序数据的异常检测(上)
- uni-app - HTML5+ Runtime 本应用使用HBuilderX x.x.x 或对应的cli版本编译,而手机端SDK版本是x.x.x。不匹配的版本可能造成应用异常。
- 《HttpClient官方文档》1.5 异常处理
- 在java 7中捕获多个异常
- 【公告】博客数据异常已全部恢复
- django之异常错误2(Error was: No module named sqlite3.base)
- 《Python参考手册(第4版•修订版)》——1.15 异常
- 《深入解析Android 虚拟机》——第2章,第2.5节内存异常和垃圾处理
- java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
- java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
- Java 获取Exception详细信息,Java获取异常详细内容
- python 调用API时异常捕获的技巧
- java多异常处理
- 『 迷你教程 』数据异常检测你没有听过的隔离森林和核密度方法
- 特征缩放是强制性的吗? 什么时候使用标准化? 什么时候使用归一化?数据的分布会发生什么变化?对异常值有什么影响?模型的准确性会提高吗?
- python 教程之如何使用python中的四分位距统计数据查找数据中的异常值
- Layui使用笔记(二):tp5+layui实现分页 数据表单的使用 解决接口异常等错误
- Coursera在线学习---第九节(1).异常数据检测(Anomaly Detection)
- 【MySQL】truncate抛异常System Lock
- Java小白入门200例99之Java常见异常及处理
- C#多线程中的异常处理