【问题标题】:Spring jackson deserialization and exception handlingSpring jackson反序列化和异常处理
【发布时间】: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


【解决方案1】:

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

@ControllerAdvice
public class ExceptionHandlerController {

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

        String yourResponse = "";
        return yourResponse;
    }

}

【讨论】:

  • 我当前的实现使用@ControllerAdvice 来捕获 MethodArgumentNotValidException ,其中包含有关多个字段的验证错误,而此 InvalidFormatException 仅包含有关一个字段的信息。我会更新我的问题以使其更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2020-08-15
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多