gpt4 book ai didi

spring - @ExceptionHandler + @ResponseStatus

转载 作者:可可西里 更新时间:2023-11-01 16:28:34 26 4
gpt4 key购买 nike

我正在使用以下代码处理我的受控异常:

  @ExceptionHandler(MyException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ModelAndView handleMyException(MyException e) {
ModelAndView mav = new ModelAndView(ERROR_PAGE);
(...)
return mav;
}

也就是说,我想对不同的错误使用自定义 View ,并对 HTTP 响应使用响应状态代码。

同时,对于纯404我在web.xml中有如下配置

<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>

<error-page>
<error-code>400</error-code>
<location>/400</location>
</error-page>

这需要一个 404 特定 View 。

问题是,当从我的 @ExceptionHandled 方法中抛出 NOT_FOUND 时,它没有显示我的自定义 View ,调试显示执行实际上是通过 handleMyException 方法,但完成后它还会通过映射 web.xml 中的 /404 的方法,这就是显示的 View 。

此外,如果我抛出不同的响应代码,我会得到异常的默认行为,而不是我的自定义 View 。

最佳答案

我无法使用 Tomcat 6 和 Spring 2.3.4 重现您的问题。这是正确的,因为根据 Servlet 规范 2.5,部署描述符定义了一个错误列表页面说明。语法允许返回资源的配置当 servlet 或过滤器调用 sendError 时由容器关于特定状态代码的响应 (...)

我跟踪了 Spring 根据 @ResponseStatus(HttpStatus.NOT_FOUND) 设置响应代码的位置它在这里:

public class ServletInvocableHandlerMethod (...)     
private void setResponseStatus(ServletWebRequest webRequest) throws IOException {
if (this.responseStatus == null) {
return;
}

if (StringUtils.hasText(this.responseReason)) {
webRequest.getResponse().sendError(this.responseStatus.value(), this.responseReason);
}
else {
webRequest.getResponse().setStatus(this.responseStatus.value());
}

// to be picked up by the RedirectView
webRequest.getRequest().setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, this.responseStatus);
}

在我的例子中,如果错误处理方法被注解了

 @ResponseStatus(HttpStatus.NOT_FOUND)

选择了以下分支:

else {
webRequest.getResponse().setStatus(this.responseStatus.value());
}

因为 HttpServletResponse.setStatus 被调用而不是 HttpServletResponse.sendError,web 容器忽略在 <error-code>404</error-code> 中定义的错误页面

我希望我的解释对你自己跟踪问题有用。我怀疑某个地方调用了 HttpServletResponse.sendError 并且它触发 Web 容器返回默认错误页面

关于spring - @ExceptionHandler + @ResponseStatus,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20395539/

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