web-dev-qa-db-ja.com

RESTful Webサービスでジャージフレームワークを使用してHTTP204ステータスコードをスローする方法は?

ジャージフレームワークを使用してRESTfulWebサービスを開発しています。次のコードを使用して、さまざまなHTTPステータスコードと応答をスローしています。

public class RestNoContentException extends WebApplicationException 
{
    public RestNoContentException(String message) 
    {
        super(Response.status(Status.NO_CONTENT)
            .entity(message).type("text/plain")
            .build());
        }
}

FirefoxMozillaレストクライアントツールを使用してREST Webサービスをテストしているときに、200 OKではなく204 NO CONTENTステータスが表示されます。他のステータスコードも同じように処理しています。ステータスコード204に対して実行しています。他のステータスコードはRESTクライアントツールに正しく表示されていますが、204ステータスコードを表示すると、200 OKステータスコードが表示されます。

誰かがここで私を助けてくれますか?私は何が欠けていますか?

16
Ashmi Suranse

まず、204は応答コードの「成功」カテゴリにあるため、例外の結果としてそれを返すことは、非常に奇妙なことです。

次に、204は「コンテンツなし」を意味します。これは、応答にエンティティが含まれていないが、エンティティが含まれていることを意味します。ジャージーが200に切り替えている可能性があります。これは、応答エンティティが含まれていることを除いて、基本的に204と同じです。

最後に、いくつかの組み込み動作によって非常に簡単に204応答を取得できます。voidメソッドとnull戻り値はどちらも204応答にマップされます。それ以外の場合は、単にResponse.status(204).build()を返します。

20
Ryan Stewart

204をスローしたい場合は、エンティティを指定しないでください。

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response test() {
    //return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200
    return Response.status(Status.NO_CONTENT).build();
}
12
secondflying

既存の応答に追加するのは1つだけです。ジャージーがしていることは スペックに関しては正しい振る舞い

3.3.3戻り値の型

リソースメソッドは、void、Response、GenericEntity、または別のJava typeを返す場合があります。これらの戻り値の型は、次のように応答エンティティ本体にマップされます。

void結果は204ステータスコードの空のエンティティ本体になります。

Response結果は、Responseのentityプロパティから、Responseのstatusプロパティで指定されたステータスコードでマップされたエンティティ本体になります。戻り値がnullの場合、ステータスコードは204になります。応答のステータスプロパティが設定されていない場合:null以外のエンティティプロパティには200ステータスコードが使用され、エンティティプロパティがnullの場合は204ステータスコードが使用されます。

GenericEntity結果は、GenericEntityのEntityプロパティからマップされたエンティティ本体になります。戻り値がnullでない場合、200ステータスコードが使用され、null戻り値は204ステータスコードになります。

Other結果は、返されたインスタンスのクラスからマップされたエンティティ本体になります。戻り値がnullでない場合、200ステータスコードが使用され、null戻り値は204ステータスコードになります。

[...]

また、例外を使用しているため、次のセクションが適用されます(私の強調)。

3.3.4例外

リソースメソッド、サブリソースメソッド、またはサブリソースロケーターは、チェックされた例外またはチェックされていない例外をスローする場合があります。実装は、すべての例外をキャッチし、次のように処理する必要があります。

  1. WebApplicationExceptionのインスタンスは、次のように応答にマップする必要があります。例外の応答プロパティにエンティティが含まれておらず、例外マッピングプロバイダー(セクション4.4を参照)がWebApplicationExceptionで使用できる場合、実装はプロバイダーを使用して新しい応答インスタンスを作成する必要がありますそれ以外の場合応答プロパティは直接使用されます。結果のResponseインスタンスは、セクション3.3.3に従って処理されます。

[...]

したがって、null、voidを返すか、204応答を作成する必要があります。アプリケーションで例外的なケースであり、例外をスローする場合にのみ例外をスローします これを明確にします

8
Bogdan