2017-09-02 6 views
0

のコンテンツタイプを取得します。だからExceptionMapperを実装しましたが、呼び出されたリソースの@Produces("application/pdf")注釈の値を取得する方法はわかりません。は、どのようにリソースを持っているJAX-RSで応答ExceptionMapper

@Provider 
public class CustomExceptionMapper implements ExceptionMapper<CustomException> { 
    @Override 
    public Response toResponse(CustomException exception) { 
     if (contentType = "application/pdf") 
      ... html respone 
     else 
      ... entity response 
    } 
} 

私はJersy 1.12実装にJAX-RSの1.1(JSR311)を使用していますが、実装に依存しないソリューションを持っているのが大好きです。

答えて

0

ExceptionMapperに異なるコンテキストオブジェクトを注入して、処理するリクエストに関する詳細情報を取得できます。 HTTPのAcceptヘッダーに基づいて、クライアントが期待するコンテンツタイプを判断すると便利です(詳細はhereを参照)。

ExceptionMapperを、Acceptヘッダーに基づいて異なるフォーマットで応答させる方法の例をAPIクライアントで指定します(または指定しないでください)。

@Provider 
public class CustomExceptionMapper implements ExceptionMapper<CustomException> { 

    // Inject headers of the request being processed 
    @Context 
    private HttpHeaders headers; 

    // or even all the request details 
    @Context 
    private HttpServletRequest request; 

    @Override 
    public Response toResponse(CustomException exception) { 
     List<MediaType> acceptedTypes = headers.getAcceptableMediaTypes(); 
     if (acceptedTypes.contains(MediaType.APPLICATION_JSON)) { 
     // respond with entity 
     } else { 
     // respond with HTML 
     } 
    } 
} 

あなたは最初のアイデアを実装することはできますが、リソースクラスにHttpServletRequestを注入し、メソッドを使用して、現在の要求のコンテキスト内にapplication/pdf文字列を格納することができます。後でgetAttribute()メソッドを使用してExceptionMapperで取得できます。 しかし、絶対に必要な場合を除き、そうすることはお勧めしません。これは、コードのコンポーネント間にあまり明らかでない依存関係を導入します。

+0

詳細な対応をありがとうございますが、これは私が求めていたものではありません。私はリクエストを受け取るのではなく、新しいウィンドウのリンクであるため、ヘッダを受け付ける必要はありません。私は既にリソースパス上に一時的な修正のベースを持っているので、提案されたsetAttributeはちょっとした作業になります。 –

関連する問題