

**実行環境:**  
Windows、Java1.8.0

JAX-RS（Jersey）を使うAPIのエラー時の処理として現在、後述のようなコードを書いています。

ここで、特定の場合にレスポンスに任意のエンティティを格納つつ、BAD_REQUESTなどのHTTPステータスを返したいのですが、方法が分かりません。  
（下記のコードでは、単にHttpServletResponseをimplementした「ResponseObj」にsetStatus()しているだけのため、機能しないようです（正常200で返ります）。

[code]

    @Path("API_01") // API呼出し時のURL
    
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseObj execute(RequestObj request) throws Exception {
        
        ResponseObj response = new ResponseObj();
        response.status = "999";
        response.message = "エラー";
        
        response.setStatus(Status.BAD_REQUEST.getStatusCode());
        
        return response;
    }
    
[/code]

  * POSTリクエストを送信すると上記のexecuteメソッドがJerseyから自動的に呼び出されます。
  * JSON形式のリクエスト内容がJerseyによって RequestObj に変換されます。
  * ResponseObjはスカラーのメンバ変数を持つ単純なVOですが、上記では試みに、  
ResponseObjはHttpServletResponseの実装としてHttpServletResponseを  
implementし、setStatus()でHTTPステータスをセットしてみたものです。  
（実行した結果、正常の200となりました）

  * 別途、  
`return Response.status(Response.Status.BAD_REQUEST.getStatusCode()).build();`  
を試したところ、想定通り400のHTTPステータスで返りましたが、レスポンスのBODY部  
にResponseObjを格納する方法が分かりませんでした。  
（HTTPレスポンスのBODY部にはResponseObjの内容のみ格納したいと考えています）

上記のリクエスト受信のHttpServletResponseを取得し、それにsetStatus()することでHTTPステータスが設定できそうだと思いますが、上記のコンテキスト中？でHttpServletResponseを取得して任意のHTTPステータスをセットする方法が分からないため、ご教示頂けますでしょうか。

もしくは、Responseビルダを使って生成するResponseのBODY部に任意のエンティティを格納する方法をご教示頂けますでしょうか。

また行おうとしといる処理内容と実装構成自体に問題があれば、ご指摘いただけますと大変助かります。


CC BY-SA 4.0
2021-06-17T13:07:21.097
77630
2023-08-08T03:09:26.183
2021-06-18T00:19:16.763
3060
42710
question
java api
APIのレスポンスで、BODYに任意のエンティティを格納してHTTPステータス200以外を返したい


`Response` 型(`javax.ws.rs.core.Response` または
`jakarta.ws.rs.core.Response`)を返すことで実現できます。

  * [3\. Resources > 3.3.3. Return Type](https://jakarta.ee/specifications/restful-ws/3.0/jakarta-restful-ws-spec-3.0.html#resource_method_return)

[code]

    @Path("API_01")
    public class MyResource {
    
        @POST
        @Produces(MediaType.APPLICATION_JSON)
        public Response execute(final RequestObj request) throws Exception {
    
            final ResponseObj response = new ResponseObj();
            response.status = "999";
            response.message = "エラー";
    
            return Response.status(Status.BAD_GATEWAY).entity(response).build();
        }
    }
    
[/code]


CC BY-SA 4.0
2021-06-18T16:53:41.360
77646
2021-06-18T16:53:41.360
2808
77630
answer