Spring总是提供非常有用的默认值来处理验证错误。但有时候看起来很难定制。在我的例子中,我有一个自定义验证,它使用javascript函数来验证域对象中的字段。默认验证错误产生4个使用对象名称,字段名称,字段类型和验证类型的消息代码。到现在为止还挺好。但我想添加一个包含js-function名称作为组件的附加代码。我怎么能这样做?
或者更一般的问题是:我在哪里可以找到Spring构建默认错误消息的方式的文档,以及如何操作它们。
在我的情况下,我得到一个输出:
{
"timestamp": 1457092927829,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.bind.MethodArgumentNotValidException",
"errors": [
{
"codes": [
"JSValidated.order.validFrom",
"JSValidated.validFrom",
"JSValidated.java.time.ZonedDateTime",
"JSValidated"
],
"arguments": [
{
"codes": [
"order.validFrom",
"validFrom"
],
"arguments": null,
"defaultMessage": "validFrom",
"code": "validFrom"
},
"checkOrder",
"static/OrderValidator.js"
],
"defaultMessage": "validation checkValidFrom failed",
"objectName": "order",
"field": "validFrom",
"rejectedValue": 1196586930,
"bindingFailure": false,
"code": "JSValidated"
},
{
"codes": [
"NotEmpty.order.id",
"NotEmpty.id",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"order.id",
"id"
],
"arguments": null,
"defaultMessage": "id",
"code": "id"
}
],
"defaultMessage": "may not be empty",
"objectName": "order",
"field": "id",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotEmpty"
}
],
"message": "Validation failed for object='order'. Error count: 2",
"path": "/order"
}
如何添加或更改代码?如何添加或更改参数列表?所有的东西都记录在哪里了?
答案 0 :(得分:0)
您可以使用@ExceptionHandler使用全局异常处理程序 您可以定义应处理哪些异常。您可以访问抛出的异常,该异常还包含验证错误。 创建自己的错误类,其中包含要返回的属性。 将验证错误映射到您的错误对象中,并将其与您选择的HTTP状态一起返回。 BindingException是我从验证中获得的一个Exception,处理程序如下所示:
@ExceptionHandler(BindException.class)
@ResponseBody
public ResponseEntity<Object> handle(HttpServletRequest req, BindException ex) {
ExceptionResponse response = new ExceptionResponse(ex);
return new ResponseEntity<>(response, HttpStatus.EXPECTATION_FAILED);
}
错误类ExceptionResponse:
@JsonInclude(Include.NON_NULL)
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
public static class ExceptionResponse{
String exception;
String message;
String trace;
public ExceptionResponse(Exception exception) {
super();
this.exception = exception.getClass().getName();
this.message = exception.getMessage();
this.trace = Arrays.toString(exception.getStackTrace());
}
答案 1 :(得分:0)
这是方法getErrorAttributes的结果的json序列化(RequestAttributes requestAttributes, 类的boolean includeStackTrace) org.springframework.boot.autoconfigure.web.DefaultErrorAttributes
此类可以扩展为添加其他属性。
代码和消息由验证者添加,如果您想要更改它们,则需要自定义验证器。