Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring mvc@ExceptionHandler方法获取相同视图_Java_Spring_Spring Mvc_Exceptionhandler - Fatal编程技术网

Java spring mvc@ExceptionHandler方法获取相同视图

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

我的问题是我想创建一个@ExceptionHandler方法来捕获所有未处理的异常。一旦捕获,我想重定向到当前页面,而不是指定一个单独的页面来显示错误

基本上,我如何获取somemethod返回的someview的值,并在下面的方法unhandledExceptionHandler中动态设置它

因此,在JSP中,我可以将此错误消息重新呈现到当前页面中

<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;
      }