Spring jackson反序列化和异常处理

时间:2016-11-29 07:34:30

标签: java json spring spring-mvc jackson

我在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上的

仅包含有关一个字段的信息。我看到的唯一选择是将其作为String传递或编写自定义验证注释。有没有更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以使用控制器建议来实现此目的。在您的应用程序中声明一个控制器建议,捕获您预期的异常,转换为您所需的响应并返回。请记住控制器建议将应用于您的所有控制器。

@ControllerAdvice
public class ExceptionHandlerController {

@ExceptionHandler(InvalidFormatException.class)
    @ResponseBody public String typeMismatchException(HttpServletRequest request, HttpServletResponse servletResponse, InvalidFormatException e ) {

        String yourResponse = "";
        return yourResponse;
    }

}
相关问题