【发布时间】:2014-03-30 12:23:14
【问题描述】:
我正在使用springmvc为客户端创建restful api,我有一个用于检查accesstoken的拦截器。
public class AccessTokenInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if (handler instanceof HandlerMethod)
{
HandlerMethod handlerMethod = (HandlerMethod) handler;
Authorize authorizeRequired = handlerMethod.getMethodAnnotation(Authorize.class);
if (authorizeRequired != null)
{
String token = request.getHeader("accesstoken");
ValidateToken(token);
}
}
return true;
}
protected long ValidateToken(String token)
{
AccessToken accessToken = TokenImpl.GetAccessToken(token);
if (accessToken != null)
{
if (accessToken.getExpirationDate().compareTo(new Date()) > 0)
{
throw new TokenExpiredException();
}
return accessToken.getUserId();
}
else
{
throw new InvalidTokenException();
}
}
在我的控制器中,我使用@ExceptionHandler 来处理异常,处理 InvalidTokenException 的代码看起来像
@ExceptionHandler(InvalidTokenException.class)
public @ResponseBody
Response handleInvalidTokenException(InvalidTokenException e)
{
Log.p.debug(e.getMessage());
Response rs = new Response();
rs.setErrorCode(ErrorCode.INVALID_TOKEN);
return rs;
}
但不幸的是,preHandle 方法中抛出的异常没有被控制器中定义的异常处理程序捕获。
谁能给我一个处理异常的解决方案? PS:我的控制器方法使用以下代码生成 json 和 xml:
@RequestMapping(value = "login", method = RequestMethod.POST, produces =
{
"application/xml", "application/json"
})
【问题讨论】:
-
你不能。
@ExceptionHandler方法仅适用于该特定控制器。拦截器在控制器之前执行,因此此时无法知道哪些@ExceptionHandler方法将适用。不确定@ControllerAdvicebean 是否会在这里帮助注册全局错误处理方法,否则实现您自己的HandlerExceptionResolver以通用方式而不是在您的控制器中实现它。 -
preHandle 方法抛出什么类型的异常?
-
ValidateToken 方法应该是小写的,就像任何其他方法一样。我面临同样的问题,但似乎确实在从 preHandle 方法抛出异常时永远不会到达 Controller 方法,因此 @ControllerAdvice 不会赶上并处理此异常。
-
我看到的行为与@klausch 相同。在 preHandle 中抛出异常时未执行 ControllerAdvice 方法
标签: java spring exception-handling interceptor