Java Spring jackson反序列化和异常处理
我正在Spring中构建RESTAPI,我的异常处理有问题。我想验证完整的请求并一次性提供有关有效负载的信息 假设我的目标是Java Spring jackson反序列化和异常处理,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我正在Spring中构建RESTAPI,我的异常处理有问题。我想验证完整的请求并一次性提供有关有效负载的信息 假设我的目标是 public class StubJson { private BigDecimal bigDecimalField; @NotEmpty private String stringField; public void setBigDecimalField(BigDecimal bigDecimalField) { this.bigDec
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中,该@ControllerAdvice将FieldError对象转换为最终用户的已翻译错误
@ResponseStatus(BAD_REQUEST)
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public List<ErrorJson> processValidationError(MethodArgumentNotValidException ex) {}
我想要这样的回答
[
{
"field": "stringField",
"message": "Cannot be empty."
},
{
"field": "bigDecimalField",
"message": "Not a number."
}
]
如果我这样做,我会得到一个
com.fasterxml.jackson.databind.exc.InvalidFormatException
在BigDecimalField上,该字段仅包含关于一个字段的信息。我看到的唯一选项是将其作为字符串传递或编写自定义验证注释。有没有更简单的方法来实现这一点?为此,您可以使用控制器建议。在应用程序中声明控制器建议,捕获预期异常,转换为所需响应并返回。请记住,控制器建议将应用于所有控制器
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(InvalidFormatException.class)
@ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e ) {
String yourResponse = "";
return yourResponse;
}
}
对象转换在准备好进行验证之前就失败了。要实现所需功能,需要从json请求成功创建对象。我当前的实现使用@ControllerAdvice捕获MethodArgumentNotValidException,其中包含有关多个字段的验证错误,而此InvalidFormatException仅包含有关一个字段的信息。我会更新我的问题,让它更清楚。
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(InvalidFormatException.class)
@ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e ) {
String yourResponse = "";
return yourResponse;
}
}