gpt4 book ai didi

spring - 在 404 上从 RESTful Spring API 返回错误 JSON(不明确的 @ExceptionHandler)

转载 作者:行者123 更新时间:2023-12-02 10:02:28 26 4
gpt4 key购买 nike

我正在使用 Spring (4.0.4) MVC 构建 RESTful API。我需要返回一个 ResponseEntity,其中包含 HTTP 状态 404 错误的 JSON 表示形式。

但是,当我发出导致 404 的请求时,我没有看到错误 JSON,而是得到以下输出:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /project/api/resource/100 was not found on this server.</p>
<p>Additionally, a 503 Service Temporarily Unavailable
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

来自this stackoverflow post ,我发现可以通过在 web.xml 中包含以下参数来防止发送此错误页面来代替错误

<init-param>
<param-name>throwExceptionIfNoHandlerFound</param-name>
<param-value>true</param-value>
</init-param>

并使用与此类似的全局建议:

@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {

@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ResponseBody
public ResponseEntity<ErrorResponse> requestHandlingNoHandlerFound(HttpServletRequest req,
NoHandlerFoundException ex) {

ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setText("error response");
return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.BAD_REQUEST);
}
}

但是,当我添加此 MyExceptionHandler 类时,我收到以下异常:

Caused by: java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.servlet.NoHandlerFoundException]: {public org.springframework.http.ResponseEntity com.rest.MyExceptionHandler.requestHandlingNoHandlerFound

问题是它不知道是调用我的自定义 ExceptionHandler 还是调用 web.servlet 中定义的异常处理程序。

如何解决此问题,以便能够使用 Spring 从 API 返回 JSON?

最佳答案

这是我认为正在发生的事情:

您的@ControllerAdvice类扩展了ResponseEntityExceptionHandler,它有一个方法handleNoHandlerFoundException(请参阅 source code 中此文件的末尾)此外,您还有一个 @ExceptionHandler 注解的方法来处理相同的异常。

@Override
ResponseEntity handleNoHandlerFoundException(NoHandlerFoundException ex,
HttpHeaders headers, HttpStatus status, WebRequest request)

我认为在您的代码中同时使用它们会导致此问题。

所以要么:

  1. 重写该方法(并且不要使用 @ExceptionHandler 注解的方法)
  2. 不要扩展 ResponseEntityExceptionHandler。请改用@ExceptionHandler 注解的方法。

我认为这两个选项都应该有效。

关于spring - 在 404 上从 RESTful Spring API 返回错误 JSON(不明确的 @ExceptionHandler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com