我使用springmvc为客户端创建了restful api,我有一个用于检查accesstoken的拦截器。如何在Spring Interceptor中使用@ExceptionHandler?
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'方法。不确定一个'@ ControllerAdvice' bean是否会在这里起作用,注册全局错误处理方法,否则实现你自己的'HandlerExceptionResolver'来以通用的方式而不是你的控制器来实现它。 –
什么类型的异常抛出preHandle方法? – Rembo
与其他方法一样,ValidateToken方法应该是小写的。 我面临同样的问题,但它似乎确实从preHandle方法抛出一个异常时,从来没有触及过Controller方法,所以@ControllerAdvice不会赶上并处理这个异常。 – klausch