2013-03-03 13 views
34

私はこれに新しいですが、いくつかのドキュメントを読むことを達成しようとしていますが、うまく動作しません。JAX-RSジャージExceptionMappersユーザ定義の例外

私はこのようなExceptionMappersを使用してUserNotFoundMapperを作成しました:私のサービスで

public class UserNotFoundMapper implements ExceptionMapper<UserNotFoundException> { 

@Override 
public Response toResponse(UserNotFoundException ex) { 
    return Response.status(404).entity(ex.getMessage()).type("text/plain").build(); 
} 

} 

この:

@GET 
@Path("/user") 
public Response getUser(@QueryParam("id") String id) throws UserNotFoundException{ 
    //Some user validation code with DB hit, if not found then 
    throw new UserNotFoundException(); 
} 

UserNotFoundExceptionUser-Defined例外です。

public class UserNotFoundException extends Exception { 
     //SOME block of code 
} 

しかし、私はサービスを呼び出す際に、UserDefinedExceptionMapperが起動していない:

は、私はこれを試してみました。 UserDefinedExceptionに何かが見つからない可能性があります。この例外を定義する方法は?

UserNotFoundExceptionの定義方法を教えてください。

答えて

51

例外マッパーに@Providerという注釈を付ける必要があります。そうしないと、JAX-RSランタイムに登録されることはありません。

@Provider 
public class UserNotFoundMapper implements 
     ExceptionMapper<UserNotFoundException> { 
    @Override 
    public Response toResponse(UserNotFoundException ex) { 
     return Response.status(404).entity(ex.getMessage()).type("text/plain") 
       .build(); 
    } 
} 
+0

返信いただきありがとうございます。私はこれに関連するいくつかのことを知る必要があります:WebApplicationExceptionの使用とExceptionMapperの使用の違いはどこですか? – WhoAmI

+3

@WhoAmI - Webアプリケーションの例外は、JAX-RSプロバイダによって自動的にマッピングされるため、例外マッパーを使用するのとは対照的に、たとえば、 'WebApplicationException'を拡張し、' getResponse'メソッドをオーバーライドすることができます。JAX-RSの実装のみで定義されているすべての例外に対して、これを行う方が好きな人もいます。マッパーはWebApplicationException(例えば、すべての標準Java例外、サードパーティのライブラリからの例外など)から拡張されない例外をマッピングするためには素晴らしいです。 – Perception

+0

次のステートメント: 'Webアプリケーションの例外はJAX-RSプロバイダによって自動的にマッピングされます.'私はネット上で読んでいるドキュメントの多くを見てきました。しかし、実際にそれが意味することを簡単に理解することができず、それの重要性/有用性は何ですか:(説明できますか? – WhoAmI

0

一つの小さな発言ではなく、タイプミスをより読みやすくにくくなり404などのコードを使用するよりもResponse.Status.NOT_FOUNDを使用しようと、同じことが「text/plainの」のために行きます。以下はあなたが言及したように例外を処理するコードです。 ああともう一つ、あなたのインタフェースにあなたの方法@Produces(MediaType.TEXT_PLAIN)というアノテーションを付加することを忘れないAPIを作成するので、私は「ドンRuntimeExceptionから延びている私自身の例外を作成するときに、私は通常、何

 

    public class UserNotFoundException extends Exception { 
     //... 
    } 

    public class UserServiceImpl implements UserService { 

     @Override 
     public Response getUser(@QueryParam("id") String id) { 
      final Response response; 
      try{ 
       // call user method 
       //if everything is ok 
       response = Response.status(Response.Status.OK).entity(whateverYouWant).type(MediaType.TEXT_PLAIN).build(); 
      } catch(UserNotFoundException ex) {   
       response = new UserNotFoundMapper().toResponse(ex); 
      } 

      return response; 
     } 
    } 

    In client slide you can check 

    public static boolean isUserExists(final Response serverResp) { 
     return serverResp != null && serverResp.getStatus() == Response.Status.NOT_FOUND.getStatusCode(); 
    } 

+6

マッパーを手動で起動するのではなく、サービスレイヤーでJersey固有のクラスを使用しないでください。それがマッパーの全ポイントです。 –

+0

@RyanStewart入力をいただきありがとうございます。私はこれに新しいし、それを学ぼうとしています。 posteddコードの上で;もし私が '新しいUserNotFoundException();をスローしてマッパー呼び出し行を削除したら、それは正しいでしょうか?私はあなたが「あなたのサービス層でジャージー固有のクラスを使用しない」という意味を理解できません。少し詳しく説明できますか? – WhoAmI

0

必ず私の例外を捕らえる必要があります。ここで

は例です:

:私はジャージー

まずでJAX-RSを使用しています:のRuntimeExceptionから延びている私自身の例外を作成します。

public class ExceptionName extends RuntimeException { 

private int code; 
private String message; 

public int getCode(){ 
    return code; 
} 

public String getMessage(){ 
    return message; 
} 

public ExceptionName(int code, String message) { 
    this.code = code; 
    this.message = message; 
} 

} 

またExceptionMapper

@Provider 
public class ExceptionName implements ExceptionMapper<ExceptionName>{ 

    @Override 
    public Response toResponse(ExceptionName exception) { 
     return Response.status(exception.getCode()).entity(exception.getMessage()).build(); 
    } 

} 

そして、私はこのどこかのようにそれを行う私は、例外マッパーがかかり、クライアントに応答を返すの世話をする例外をスローするたびを実装API

関連する問題