2015-01-04 277 views
0

现在我有一个方面:Spring MVC中使用AOP而404出错

@Around(value = "execution(* package.controller.*.*View(..)) && args(.., request)") 
public ModelAndView getUserProfile(ProceedingJoinPoint proceedingJoinPoint, HttpServletRequest request) throws Throwable { 
    ModelAndView view = null; 
    view = (ModelAndView) proceedingJoinPoint.proceed(); 

    HttpSession session = request.getSession(); 
    boolean isLoggedIn = isLoggedIn(session); 
    if (isLoggedIn) { 
     User user = (User)session.getAttribute("user"); 
     view.addObject("isLogin", isLoggedIn) 
      .addObject("profile", user); 
    } 
    return view; 
} 

正如你看到的,一旦*查看方法被调用,这方面将会议信息添加到ModelAndView对象。

但是,当发生HTTP 404错误时,此方面将不起作用。 但是我怎样才能在404错误页面上向ModelAndView对象添加额外的信息?

我已经创建了自己的错误页面,404错误:

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/views/errors/404.jsp</location> 
</error-page> 

非常感谢。

+0

我不是一个Spring用户,而是一个AOP专家。你能指定什么“方面不起作用”的意思吗?该建议是否被触发?你看到一个例外吗?作为编辑请添加对您的问题有用的任何内容。 – kriegaex 2015-01-04 13:48:36

+0

@ kriegaex当页面存在时,AOP正常工作(返回HTTP 200)。但是如果页面不存在,那么就没有控制器来处理请求。所以AOP将无法工作。 – 2015-01-04 15:49:33

+0

为什么这么复杂的解决方案?为什么不简单使用'HandlerIntereptor'或(在这种情况下更好)'Filter'。添加到模型中的内容仅作为请求属性公开。 – 2015-01-04 18:20:47

回答

1

您可以在控制器中使用@ExceptionHandler来处理错误并向ModelAndView添加额外信息。每当出现错误时都会调用它,并允许您修改响应。

看看位于Spring文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

下面是来自权从Spring博客一个很好的例子: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

@ExceptionHandler(Exception.class) 
    public ModelAndView handleError(HttpServletRequest req, Exception exception) { 
    logger.error("Request: " + req.getRequestURL() + " raised " + exception); 

    ModelAndView mav = new ModelAndView(); 
    mav.addObject("exception", exception); 
    mav.addObject("url", req.getRequestURL()); 
    mav.setViewName("error"); 
    return mav; 
    }