16

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

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

Firefox Mozilla REST クライアント ツールを使用して REST Web サービスをテストしているときに、200 OKではなくステータスが表示されます204 NO CONTENT。status code に対して行っているのと同じ方法で、他のステータス コードを処理しています204。その他のステータス コードは残りのクライアント ツールに正しく表示されますが、ステータス コードを表示するときに204ステータス コードが表示され200 OKます。

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

4

3 に答える 3

20

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

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

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

于 2013-01-01T04:58:34.187 に答える
13

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();
}
于 2013-01-01T02:21:04.160 に答える
9

既存の回答に追加することは 1 つだけです。Jersey が行っていることは、仕様に関する正しい動作です

3.3.3 戻り型

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

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

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

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

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

[...]

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

3.3.4 例外

リソース メソッド、サブリソース メソッド、またはサブリソース ロケーターは、チェック済みまたは未チェックの例外をスローする可能性があります。実装は、すべての例外をキャッチして、次のように処理する必要があります。

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

[...]

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

于 2013-01-04T13:08:26.940 に答える