2016-07-12 4 views
1

私はジャージーを使用してmvcアプリケーションを構築しています。 Pathパラメータ(@PathParam)を受け入れるメソッドです。ジャージー例外マッピング別のコンテキスト

カスタム例外がスローされた場合(ExampleException)、例外マッパーを使用して404 Not Found応答が返されます。

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Override 
    public Response toResponse(ExampleException ex) { 
     return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 

} 

しかし、私は@ FormParamを実装しているので、ユーザーはサーバーにPOSTします。厳密な例外が発生しますが、代わりに400 Bad Requestレスポンスを返します。例外を修正することなく、例外マッパーが適切な応答コードを返すようにする方法はありますか?

答えて

1

最も単純な方法は、複数のExceptionMappersを作成することです。それぞれ、ExampleExceptionの特定のサブクラスに対して作成します。

しかし、あなたはどちらの場合も同じ例外を持っていて、マッパーにrequestを注入し、それが何であるかの方法をチェックすることができ、GET/PathParamとPOST/FormParamために404をスローするかどうかを決定します:

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Context Request request;   
    @Override 
    public Response toResponse(ExampleException ex) { 
     if ("POST".equals(requset.getMethod())) 
      return Response.status(Status.BAD_REQUEST).build(); 
     else 
      return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 
} 

PathParamsで決定する場合は、UriInfoを入力することができます。

@Provider 
public class ExampleExceptionMapper implements ExceptionMapper<ExampleException> { 
    @Context UriInfo info;   
    @Override 
    public Response toResponse(ExampleException ex) { 
     if (info.getPathParameters().isEmpty())) //please make better condition based on your needs 
      return Response.status(Status.BAD_REQUEST).build(); 
     else 
      return Response.status(Status.NOT_FOUND).entity("Not Found - " + ex.getMessage()).build(); 
    } 
} 
関連する問題