如何在Spring Web 5(启动)中呈现BindingResult,就像默认错误处理程序一样?

时间:2018-05-01 23:28:17

标签: spring spring-mvc spring-boot

我使用<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>注释来验证控制器中方法的JSON输入参数。它是通过spring-boot-starter-web 2.0.1.RELEASE提供API的Web应用程序。

当对象验证发现错误时,默认异常处理程序会生成非常好的JSON,解释输入的确切错误。

问题在于我拥有自己的@RequestBody @Valid,因为我的API与失败消息签订了合同。我想在我自己的JSON下包含Spring的验证JSON结构。

在我的自定义异常hanlder中,我看到我收到@ExceptionHandler,但我不知道如何将其反序列化为JSON,就像Spring在内部一样。显然,在Spring中有一些类可以做到。

有人可以提示吗?

下面我希望成为我的对象的一部分的JSON示例

MethodArgumentNotValidException

1 个答案:

答案 0 :(得分:0)

我找不到解决此问题的库方法。我省略了渲染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