java – 如何在Spring Interceptor中使用@ExceptionHandler?

我正在使用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"
})
最佳答案
使用其他方法解决,捕获异常并转发到另一个控制器.

try
{
    Validatetoken(token);
} catch (InvalidTokenException ex)
{
    request.getRequestdispatcher("/api/error/invalidtoken").forward(request,response);
    return false;
} catch (TokenExpiredException ex)
{
    request.getRequestdispatcher("/api/error/tokenexpired").forward(request,response);
    return false;
}

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...