Java spring mvc@ExceptionHandler方法获取相同视图
我的问题是我想创建一个@ExceptionHandler方法来捕获所有未处理的异常。一旦捕获,我想重定向到当前页面,而不是指定一个单独的页面来显示错误 基本上,我如何获取somemethod返回的someview的值,并在下面的方法unhandledExceptionHandler中动态设置它 因此,在JSP中,我可以将此错误消息重新呈现到当前页面中Java spring mvc@ExceptionHandler方法获取相同视图,java,spring,spring-mvc,exceptionhandler,Java,Spring,Spring Mvc,Exceptionhandler,我的问题是我想创建一个@ExceptionHandler方法来捕获所有未处理的异常。一旦捕获,我想重定向到当前页面,而不是指定一个单独的页面来显示错误 基本上,我如何获取somemethod返回的someview的值,并在下面的方法unhandledExceptionHandler中动态设置它 因此,在JSP中,我可以将此错误消息重新呈现到当前页面中 <c:if test="${not empty UNHANDLED_ERROR}"> <div class="messa
<c:if test="${not empty UNHANDLED_ERROR}">
<div class="messageError"> ${UNHANDLED_ERROR}</div>
</c:if>
${未处理的\u错误}
我认为没有办法满足您的要求,因为在异常处理程序方法unhandledExceptionHandler
中,无法找到处理程序方法somemethod
将返回的视图的名称
唯一的方法是引入某种元数据方案,这样当您在异常处理程序中结束时,您就可以确定将其映射到哪个视图。但我认为这个元数据方案会相当复杂。您可以通过找出引发异常时访问的原始url是什么来实现这样的方案,这可以通过下面的代码片段来完成
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest()
一旦知道原始请求URL可以重定向到它,可以使用flash属性来存储发生异常的事实以及错误是什么
当您有一个在不同视图之间进行选择的处理程序方法时,元数据的主要问题就会出现,例如
@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(HttpSession session) throws Exception {
String abc = null;
if(someCondition) {
abc.length();
return "someview";
} else {
// do some stuff here.
return "someOtherView";
}
}
即使知道somemethod是错误的来源,您也不知道if语句中的哪个分支导致了异常 您可以将错误放在ModelAndView对象中,而不是在单独的页面上发送错误。在您的情况下,您可以将try/catch放在控制器方法中,并返回相同的视图,如下所示:
@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(ModelAndView mv,HttpSession session) throws Exception {
mv.setViewName("someview");
try{
String abc = null;
abc.length();
} catch(Exception e) {
mv.addObject("UNHANDLED_ERROR", "UNHANDLED ERROR. PLEASE CONTACT SUPPORT. "+ex.getMessage());
}
return mv;
}
因此,将model和view添加到您的方法中并返回它。我认为如果不修改所有的处理程序方法,您无法完成此操作。但是,您可以尝试以“漂亮”的方式执行此操作: 1) 您可以定义自己的注释,该注释将接受目标视图名称作为参数(例如
@ExceptionView
)
2) 接下来要做的是用它标记处理程序方法,例如:
@ExceptionView("someview")
@RequestMapping(value = "/somepage", method = RequestMethod.GET)
public String somemethod(HttpSession session) throws Exception {
String abc = null;
abc.length();
return "someview";
}
3) 之后,您可以在异常处理程序中执行以下操作:
@ExceptionHandler(Exception.class)
protected ModelAndView unhandledExceptionHandler(Exception ex, HandlerMethod hm) {
String targetView;
if (hm != null && hm.hasMethodAnnotation(ExceptionView.class)) {
targetView = hm.getMethodAnnotation(ExceptionView.class).getValue();
} else {
targetView = "someRedirectView"; // kind of a fallback
}
ModelAndView mv = new ModelAndView();
mv.setViewName(targetView);
mv.addObject("UNHANDLED_ERROR", "UNHANDLED ERROR. PLEASE CONTACT SUPPORT. "+ex.getMessage());
return mv;
}
我还没有尝试过,但是根据文档,我们可以在异常处理程序中获得请求对象。我们可能无法将视图链接到URL。从URL获取视图以及视图的状态/模型将是一个棘手的部分
@ExceptionHandler(Exception.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
logger.error("Request: " + req.getRequestURL() + " raised " + ex);
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}
@RequestMethod(“/server error”)注释的控制器方法
@ExceptionHandler
注释的控制器方法,该方法将返回“转发:/server错误”代码>
谢谢我想我现在只能重定向到一个错误页面。我将把这个问题留待几天讨论。如果仍然没有响应,我将接受它作为一个答案。这样,我需要在我试图避免的每个方法上都这样做。@aaron blenkush我已经完成了这方面的工作,但在每个映射请求的一个控制器类中,而不是在方法中,所以不确定interestingBounty是否很快过期!这可以通过1-2行代码来解决。干杯。@AaronBlenkush,你有答案了吗?你有机会分享吗?真想看看:)
@ExceptionHandler(Exception.class)
public ModelAndView handleError(HttpServletRequest req, Exception ex) {
logger.error("Request: " + req.getRequestURL() + " raised " + ex);
ModelAndView mav = new ModelAndView();
mav.addObject("exception", ex);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}