spring - 如何像默认错误处理程序一样在 Spring web 5(启动)中呈现 BindingResult?
问题描述
我使用@RequestBody @Valid
注释来验证控制器中方法的 JSON 输入参数。它是通过 spring-boot-starter-web 2.0.1.RELEASE 提供 API 的 Web 应用程序。
当对象验证发现错误时,默认异常处理程序会生成非常好的 JSON 来解释输入到底有什么问题。
问题是我有自己的@ExceptionHandler
,因为我的 API 有失败消息的合同。我想将 Spring 的验证 JSON 结构合并到我自己的 JSON 中来包装它。
在我的自定义异常处理程序中,我看到我收到了MethodArgumentNotValidException
,但我不知道如何像 Spring 在内部那样将它反序列化为 JSON。显然,在 Spring 中有一些类可以做到这一点。
有人可以给个提示吗?
下面的 JSON 示例,我想成为我的对象的一部分
{
"timestamp" : "2018-05-01T22:45:28.907+0000",
"status" : 400,
"error" : "Bad Request",
"errors" : [{
"codes" : ["NotNull.ticket.items[0].amount", "NotNull.ticket.items.amount", "NotNull.items[0].amount", "NotNull.items.amount", "NotNull.amount", "NotNull.java.math.BigDecimal", "NotNull"],
"arguments" : [{
"codes" : ["ticket.items[0].amount", "items[0].amount"],
"arguments" : null,
"defaultMessage" : "items[0].amount",
"code" : "items[0].amount"
}
],
"defaultMessage" : "may not be null",
"objectName" : "ticket",
"field" : "items[0].amount",
"rejectedValue" : null,
"bindingFailure" : false,
"code" : "NotNull"
}
],
"message" : "Validation failed for object='ticket'. Error count: 1",
"path" : "/v1/databases/00000000-0000-0000-0000-000000000000/retail/pos/ticket"
}
解决方案
我找不到解决此问题的库方法。我省略了渲染arguments
,因为它太费力了。
List<Map> validationErrors = new ArrayList<>();
BindingResult result = ((MethodArgumentNotValidException) e).getBindingResult();
for (FieldError error : result.getFieldErrors()) {
Map<String, Object> res = new HashMap<>();
res.put("codes", error.getCodes());
res.put("defaultMessage", error.getDefaultMessage());
res.put("objectName", error.getObjectName());
res.put("field", error.getField());
res.put("rejectedValue", error.getRejectedValue());
res.put("bindingFailure", error.isBindingFailure());
res.put("code", error.getCode());
validationErrors.add(res);
}
for (ObjectError error : result.getGlobalErrors()) {
Map<String, Object> res = new HashMap<>();
res.put("codes", error.getCodes());
res.put("defaultMessage", error.getDefaultMessage());
res.put("objectName", error.getObjectName());
res.put("code", error.getCode());
validationErrors.add(res);
}
// now attach validationErrors to object
推荐阅读
- haskell - 循环图上的记忆遍历
- ruby-on-rails - Sublime Text & Source Tree 在 Excel VBA 中使用 xml.File 和 fsObject 生成的文件中看不到 FileDiff
- .net - .Net 远程设置 - 第一次请求后不起作用
- python - 为什么链接增强赋值会引发 SyntaxError
- php - 字符串对于回显功能来说太长了?
- r - 数据表中的“:”运算符(这与 := 无关,而只是:任何人都可以建议。)
- java - 如何从 matcher.group() 获取字符串并将其存储在 java 中的单独字符串变量中?
- android - 在 APK 打包之前运行编译好的 Java 代码
- c - 如何通过多个字符比较两个字符串?
- typescript - 类型“字符串”不可分配给类型“字符串和数字”。ts(2322)