我使用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