我在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."
}
]
如果我这样做,我会得到一个
BigDecimalField上的com.fasterxml.jackson.databind.exc.InvalidFormatException
仅包含有关一个字段的信息。我看到的唯一选择是将其作为String传递或编写自定义验证注释。有没有更简单的方法来实现这一目标?
答案 0 :(得分:0)
您可以使用控制器建议来实现此目的。在您的应用程序中声明一个控制器建议,捕获您预期的异常,转换为您所需的响应并返回。请记住控制器建议将应用于您的所有控制器。
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(InvalidFormatException.class)
@ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e ) {
String yourResponse = "";
return yourResponse;
}
}