【问题标题】:Spring Boot Custom HTTP EXCEPTIONSpring Boot 自定义 HTTP 异常
【发布时间】:2019-12-10 05:11:15
【问题描述】:

我有这种方法来处理所有请求标头丢失的异常,但在一个控制器中,预计会接收一个 json 作为正文。如果它是无效的 json 或为 null,它会丢弃带有自定义消息的异常:

@ExceptionHandler(value = {ServletRequestBindingException.class, HttpMessageNotReadableException.class})
public final ResponseEntity<ErrorResponse> handleHeaderException(Exception ex) {
    List<String> details = new ArrayList<>();
    details.add(ex.getMessage());
    return new ResponseEntity<>(new ErrorResponse("Bad Request", details), HttpStatus.BAD_REQUEST);
}

{ “消息”:“错误请求”, “细节”: [ “缺少所需的请求正文:public org.springframework.http.ResponseEntity packages.fazerLogin(packages.BodyLogin) 抛出 java.io.IOException" ] }


{ “消息”:“错误请求”, “细节”: [ “JSON 解析错误:意外字符('\”'(代码 34)):期望用逗号分隔对象条目;嵌套异常是 com.fasterxml.jackson.core.JsonParseException:意外字符 ('\"' (code 34)): 期望用逗号分隔 Object 条目\n at [来源:(PushbackInputStream);行:3,列:3]" ] }

但我不想要像上面这样的长消息。只是“必需的请求正文”或“JSON 解析错误”就可以了。我想知道我能做什么。

我的控制器:

@PostMapping(value = "v1/token", consumes = "application/json;charset=UTF-8")
public ResponseEntity<TokenOutputDto> doLogin(@RequestBody @Valid BodyLogin body) throws IOException {
    return authenticationModel.auth(body.getEmail(), body.getPassword());
}

另外,我应该为每个可能的异常(HttpClientErrorException、HttpServerErrorException 等)创建一个@ExceptionHandler 方法吗?这将是一个不好的做法,因为代码将几乎相同地重复......

【问题讨论】:

  • 不,如果您需要以不同方式处理每个异常,那么您需要不同的方法

标签: java spring spring-boot spring-mvc


【解决方案1】:

您可以通过以下方式在您的方法中处理这些异常处理程序:

@ExceptionHandler(value = {ServletRequestBindingException.class, HttpMessageNotReadableException.class})
public final ResponseEntity<ErrorResponse> handleHeaderException(Exception ex) {
    List<String> details = new ArrayList<>();
    if (ex instanceof IOException ) {
        if (ex.getCause() instanceof JsonParseException) {
            details.add("JSON parse error");
        } else {
            details.add("Required request body");
        }
    } else {
        details.add(ex.getMessage());
    }
    return new ResponseEntity<>(new ErrorResponse("Bad Request", details), HttpStatus.BAD_REQUEST);
}

【讨论】:

  • if (ex instanceof IOException ) 将永远为假,因为 ex 是一个异常......对吧?
  • 好的,所以你应该检查它的原因,是的,它是如何工作的?异常被包裹在某个点然后你可以检查该异常是否被包裹在第二层或者第三层直到你找到它
猜你喜欢
  • 2019-12-12
  • 2021-07-10
  • 2019-02-25
  • 1970-01-01
  • 2020-05-26
  • 2014-12-16
  • 2023-03-04
  • 2020-12-21
  • 2017-09-12
相关资源
最近更新 更多