2016-08-10 3 views
1

私はSpringブートを使用してAPIを構築しています。リクエストヘッダからトークンを取得して認証するための認証フィルタを設定しました。ユーザーがトークンを使用して見つからない場合、InvalidWSUserExceptionがスローされます。スプリングブート@ExceptionHandlerが関連する例外をキャッチしていません

多くの@ExceptionHandlerを保持するクラスを作成して、InvalidWSUserExceptionを捕捉し、リクエスト中のトークンが無効であることを要求元のクライアントに通知するJSON文字列で応答できるようにしました。

私はこの作業を別のプロジェクトで行っていましたが、この新しいプロジェクトでは機能しないようです。

Handlerが応答を処理する必要があるため、InvalidWSUserExceptionは空です。

public class InvalidWSUserException extends RuntimeException { 
} 

私はハンドラクラスをそう定義しました。私は例外を投げていたクラスがビーンを経て春によってインスタンス化されていなかったが、私はこのクラスの上にチェックしました、そして育てているクラス以前のプロジェクトで問題があった

@ControllerAdvice 
public class ExceptionController { 

    @ExceptionHandler(value=InvalidWSUserException.class) 
    public ResponseEntity invalidWSUserException(InvalidWSUserException exception) { 
     return new WSResponse().send(HttpStatus.UNAUTHORIZED, "Invalid token."); 
    } 

} 

例外は@Autowiredアノテーションによってインスタンス化されます。

なぜ@ExceptionHandlerが私が考えるべきことをしていないのか理解するのに苦労しています。

確認すると、ブラウザに表示される出力はエラー500 json応答です。それは@ExceptionHandler

{ 
    "timestamp": 1470833849289, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "digital.sheppard.exceptions.InvalidWSUserException", 
    "message": "No message available", 
    "path": "/api/product" 
} 

答えて

-1

あなたが上に置くように私は、JSON Web Token for Javaライブラリでの作業、およびてるからEntityResponseあるべきなところ、私は、認証サービスで同じエラーが発生しました。私は@ControllerAdviceで試しましたが、解決策はありませんでした。

長い研究の末、私は解決策を見つけました。あなたのJwtFilterを実装する必要があり、かつ、代わりに例外を起動するのには、次を追加するために、あなたのHttpServletResponse値を変更する必要があります。

if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());  
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

final String token = authHeader.substring(7); 

try { 
    final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody(); 
    request.setAttribute("claims", claims); 
} catch (final SignatureException e) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());   
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

chain.doFilter(req, res); 

あなたが見ることができるように、私は例外打ち上げをコメントし、Iました応答ヘッダーのオーバーライド用に変更します。 getErrorJson()は、JSON値を文字列として返します(または、あなたの体として文字列を置くことしかできません)。

私はこれがうまくいくことを願っています。

P.D .: authを実装するために私はinstructionsに従いました。

関連する問題