我正在尝试处理JSP视图抛出的异常。由于Spring MVC无法直接处理这些异常,因为它们被抛出控制器的范围,我试图通过HandlerInterceptorAdapter
处理它们。
afterCompletion
方法使我可以访问从JSP抛出的异常,因此我可以使用唯一的错误ID记录异常。但另外我想向客户显示一个用户友好的错误页面。所以我的第一个想法是将用户重定向到我现有的错误页面,该页面显示唯一的错误ID。
但似乎忽略了重定向。是否可以在此方法中进行重定向?或者是否可以更改响应,因为它已经呈现?
这是我的第一次尝试:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import de.lwv.mass2.client.web.controller.BasicExceptionHandlerController;
@Component
public class JspExceptionHandler extends HandlerInterceptorAdapter {
private static Logger LOGGER = LoggerFactory.getLogger(JspExceptionHandler.class);
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (ex != null) {
final String uuid = BasicExceptionHandlerController.generateExceptionUUID();
LOGGER.error("Exception: " + uuid, ex);
// redirect
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.sendRedirect(request.getContextPath() + "/error?id=" + uuid);
}
}
}
答案 0 :(得分:1)
我认为在调用afterCompletion
时已经提交了响应(以及呈现的视图)。
作为替代建议,您可以向error-page
添加web.xml
,它将充当“全部捕获”处理程序 - 捕获源自JSP视图的异常和无法处理的其他异常由HanlderInterceptorAdapter
例如,在您的web.xml中,您可以添加:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error</location>
</error-page>
您还可以通过错误代码定义这些:
<error-page>
<error-code>500</error-code>
<location>/error</location>
</error-page>
<location>
可以是另一个控制器,一个静态HTML页面或一个JSP视图 - 如下所示。
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/jsp/500.jsp</location>
</error-page>