How to use @ExceptionHandler in Spring Interceptor?
exception, interceptor, java, spring
Solution
Solved using other approach, catch exception and forward to another controller.
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;
}
Problem
I am using springmvc to create restful api for client, I have an interceptor for checking the 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(); } } ``` And in my controller, I use @ExceptionHandler to handle exceptions, the code to handle InvalidTokenException looks like ``` @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; } ``` But unfortunately the exception throwed in preHandle method is not caught by the exception handler defined in controller. Can any one give me an solution of handling the exception? PS: My controller method produce both json and xml using code below: ``` @RequestMapping(value = "login", method = RequestMethod.POST, produces = { "application/xml", "application/json" }) ```