我认为这个问题对于异常是通用的,但让我们使用我的例子。
成功登录后,我有一个“用户主页”页面的直接控制器。
@Controller
@RequestMapping("/user-home")
public class UserHomeController {
private static Log log = LogFactory.getLog(UserHomeController.class);
@RequestMapping(method = RequestMethod.GET)
public String getUserHome(HttpServletRequest request) {
if (request.getSession(false) == null) {
throw new UnauthorizedClientException("Could not authenticate request. There is no session present for this request.");
} else {
return "user_home";
}
}
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler({UnauthorizedClientException.class})
public void handle404() {
log.info("An UnauthorizedClientException was thrown inside UserHomeController.");
}
}
所以,它有效,即当没有会话时我得到默认的404页面,但是我传递给UnauthorizedClientException的消息无处可寻。 404页面有“消息:”,后面没有任何内容。
我的留言去了哪里?通常传递给异常构造函数的消息的目的是什么?
答案 0 :(得分:4)
你误解了UnauthorizedClientException
的用途。它不是为你呈现一个页面,它只是内部控制流程。
当您抛出该异常时,Spring会捕获它,并将其传递给handle404()
方法。该方法又负责相应地处理异常。
@ExceptionHandler
- 带注释的方法在几乎所有方面都与@RequestMapping
方法类似。这意味着如果有任何有用的事情发生,他们必须返回视图和模型。
但是,您所做的所有方法都是将异常消息记录到其内部记录器,然后返回。它不会返回视图,因此默认错误页面不会呈现异常;并且它不会返回模型,因此不会显示任何消息。
您需要将handle404()
方法更改为(a)返回要呈现的JSP的名称,并(b)将相应的消息添加到模型中。
答案 1 :(得分:1)
做这样的事情怎么样?
@ExceptionHandler(UnauthorizedClientException.class)
public ModelAndView handle404(UnauthorizedClientException exception) {
ModelAndView modelAndView = new ModelAndView("/errors/404");
modelAndView.addObject("message", exception.getMessage());
return modelAndView;
}
这样,您可以设置来自异常的消息并将其显示在格式良好的404错误页面中。
答案 2 :(得分:0)
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler({UnauthorizedClientException.class})
public void handle404() {
这是否意味着如果你有404和另一个异常类,你的处理程序将不会被调用?如果删除了@ExceptionHandler
注释,会发生什么?
如果在此更改后调用您的处理程序,那么建议您为另一个获取404。