Java Spring jackson反序列化和异常处理

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

我正在Spring中构建RESTAPI,我的异常处理有问题。我想验证完整的请求并一次性提供有关有效负载的信息

假设我的目标是

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;
    }

}