1

Glassfish 4 で Jersey 2.3.1 を使用しています。

私のリソースメソッドは次のようになります。

        @POST
        @Consumes("application/x-www-form-urlencoded")
        @Path("/update")
        public Response update(MultivaluedMap<String, String> formParams){
    //business logic
    //return appropriate Response object
    }

私はいつもformParams.size()ゼロになります。送信されたフォーム パラメータがMultivaluedMapオブジェクトで使用できないのはなぜですか?

サーバー ログの次の警告メッセージ:

警告: URI へのサーブレット リクエストにはhttp://localhost:8080/myApp/resource/update、リクエスト ボディにフォーム パラメータが含まれていますが、リクエスト ボディは、リクエスト パラメータにアクセスするサーブレットまたはサーブレット フィルタによって消費されています。@FormParam を使用するリソース メソッドのみが期待どおりに機能します。他の方法でリクエスト本文を使用するリソース メソッドは、期待どおりに機能しません。

(すべてのサーブレットフィルターを無効にする前後にテストしました。ジャージーフィルターは使用していません)

4

1 に答える 1

2

HttpServletResponse.getParameter(paramName) を呼び出して、フォーム データを含むリクエスト ボディが既に使用されている場合、このメッセージが表示されます。これは、登録されたサーブレット フィルタがこのメソッドを呼び出した場合に発生する可能性があります。Jersey ContainerRequestFilter はそれに影響を与えることはできません。そのため、デプロイ (web.xml) の構成を調査することをお勧めします。Jersey 2.5-SNAPSHOT と Glassfish 4 ナイト ビルド (glassfish-4.0.1-b04-12_04_2013) で Form エンティティの注入をテストしましたが、動作します。

リクエストの本文が既に消費されている場合でも、フォーム パラメータを使用できますが、(コードのように) エンティティとして挿入することはできません。パラメータが消費される場合、@FormParam JAX-RS アノテーションを使用してパラメータを注入できます。

@POST
@Consumes("application/x-www-form-urlencoded")
public String postForm(@FormParam("paramKey") String paramValue) {
    return paramValue;
}
于 2013-12-11T12:57:03.843 に答える