【发布时间】:2016-11-29 07:34:29
【问题描述】:
我正在 Spring 中构建一个 REST api,但我的异常处理存在问题。我想一次性验证完整的请求并提供有关有效负载的信息。
假设我的对象是
public class StubJson {
private BigDecimal bigDecimalField;
@NotEmpty
private String stringField;
public void setBigDecimalField(BigDecimal bigDecimalField) { this.bigDecimalField = bigDecimalField; }
public String setStringField(String stringField) { this.stringField = stringField; }
}
我的控制器是
@RestController
public class StubController {
@RequestMapping(value = "/stub", method = POST)
public void stub(@Valid @RequestBody StubJson stubJson) {}
}
对此对象的验证在 @ControllerAdvice 中,它将 FieldError 对象转换为最终用户的翻译错误。
@ResponseStatus(BAD_REQUEST)
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public List<ErrorJson> processValidationError(MethodArgumentNotValidException ex) {}
如果我传入这个 json
{"bigDecimalField": "text", "stringField": ""}
我想要这样的回应
[
{
"field": "stringField",
"message": "Cannot be empty."
},
{
"field": "bigDecimalField",
"message": "Not a number."
}
]
如果我这样做,我会得到一个
com.fasterxml.jackson.databind.exc.InvalidFormatException
在 BigDecimalField 上,它只包含关于只有一个字段的信息。我看到的唯一选择是将其作为字符串传递或编写自定义验证注释。有没有更简单的方法来实现这一点?
【问题讨论】:
-
您的对象转换在准备好验证之前就失败了。为了实现你想要的,你的对象需要从你的 json 请求中成功创建
-
@ScanQR 你会怎么做?
标签: java json spring spring-mvc jackson