Spring MVC中使用AOP而404出错
问题描述:
现在我有一个方面: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>
非常感谢。
答
您可以在控制器中使用@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;
}
我不是一个Spring用户,而是一个AOP专家。你能指定什么“方面不起作用”的意思吗?该建议是否被触发?你看到一个例外吗?作为编辑请添加对您的问题有用的任何内容。 – kriegaex 2015-01-04 13:48:36
@ kriegaex当页面存在时,AOP正常工作(返回HTTP 200)。但是如果页面不存在,那么就没有控制器来处理请求。所以AOP将无法工作。 – 2015-01-04 15:49:33
为什么这么复杂的解决方案?为什么不简单使用'HandlerIntereptor'或(在这种情况下更好)'Filter'。添加到模型中的内容仅作为请求属性公开。 – 2015-01-04 18:20:47