【问题标题】:Spring Boot - how to handle UnrecognizedPropertyException from Jackson manually?Spring Boot - 如何手动处理来自 Jackson 的 UnrecognizedPropertyException?
【发布时间】:2016-10-15 19:11:39
【问题描述】:

所以我有一个控制器可以输入请求正文:

@RestController
@RequestMapping("/foo/bar")
public class FooBarController {
    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<?> doTheFoo(@RequestBody MyDto dto) {
        ...
    }
}

我有这个 FooBar:

public clas FooBar {
    @JsonProperty("foo")
    private String foo;

    public void setFoo(String foo) { ... }
    public String getFoo() { ... }
}

我已经在我的属性中设置了在未知属性上失败:

spring.jackson.deserialization.fail-on-unknown-properties: true

我还有一个处理程序来尝试捕获失败:

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(UnrecognizedPropertyException.class)
    public ResponseEntity<?> handleUnrecognizedPropertyException(UnrecognizedPropertyException ex) {
        ...
    }
}

但是当我使用未知属性(例如{"bar": "baz"})发布到我的端点时,GlobalExceptionHandler 中的任何内容都不会运行,而是返回一个普通的 400 BAD REQUEST。如何拦截未知属性异常并提供不同的响应?

【问题讨论】:

  • 如果没有未知属性被发布,控制器是否正常工作?
  • 这不是重点;我想返回一个自定义错误页面,而不是一个带有 400 Bad Request 的空页面。
  • 我问是因为 4xx 是客户端错误请求。是因为您的帖子在控制器要求 json 时以表格形式发送吗?或者可能是其他原因,导致您的异常处理程序没有捕获指定的异常。

标签: java spring exception-handling spring-boot jackson


【解决方案1】:

如果您正确使用该属性并且您的控制器运行良好,您可以拦截 HttpMessageNotReadableException 异常。

【讨论】:

  • 我遇到的另一个问题是我无法覆盖扩展的 ResponseEntityExceptionHandler 类(最初不是在帖子中)。谢谢!
【解决方案2】:

试试 Spring Boot 的 BasicErrorController。这应该看起来像这样。

   @Controller
   @RequestMapping
   public class ErrorController {
    @RequestMapping( value = "/error/404.html" )
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public String pageNotFoundError( HttpServletRequest request ) {
        "errors/404"
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多