web-dev-qa-db-ja.com

ジャージーを修正する方法POSTリクエストパラメータの警告?

私は非常にシンプルなREST Jerseyを使用してAPIを構築しています。ログファイルに不明な警告が表示されています。

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

私のwebappには、/ myapi/*にマップされたJerseyサーブレットのみが定義されています

これらの警告を停止するにはどうすればよいですか?

38
brabster

私にとって警告はPOST application/x-www-form-urlencoded。に対して表示されていました。そして、他の何よりも前にgetParameterを実行するHiddenHttpMethodFilterを持つSpring Bootを使用しています...この厄介なオーバーライドを行うまで:

@Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new HiddenHttpMethodFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                    FilterChain filterChain) throws ServletException, IOException {
                if ("POST".equals(request.getMethod())
                        && request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
                    filterChain.doFilter(request, response);
                } else {
                    super.doFilterInternal(request, response, filterChain);
                }
            }
        };
    }
13
javo

このメッセージは、リクエストエンティティボディが消費されたことを開発者に警告するためのもので、メッセージボディを読み取る他の試みは失敗します。

メッセージを無視するか、ログからフィルターで除外しても安全です。

Java.util.logging.Logger jerseyLogger =
        Java.util.logging.Logger.getLogger(WebComponent.class.getName());
jerseyLogger.setFilter(new Filter() {
    @Override
    public boolean isLoggable(LogRecord record) {
        boolean isLoggable = true;
        if (record.getMessage().contains("Only resource methods using @FormParam")) {
            isLoggable = false;
        }
        return isLoggable;
    }
});
10
Iulian Ghionoiu

次の thread は、受け取っている警告を示しています。 Jerseyが処理する前にリクエストを処理するweb.xmlで定義されたフィルターがあるように思えます。

6
Alex Winston

最後に、リクエストヘッダーにContent-Type:application/jsonが含まれていることを確認して(明らかに、クライアント側で)、これを取り除きました

4
Arnold B.

JQueryのajax関数をcontentType: "application/x-www-form-urlencoded; charset=UTF-8"に設定したところです。以前の解決策(ジャージーなし)では、エンコーディングの問題がいくつかありました。私がそれを削除したとき、メッセージは消えてすべてがうまくいきました。

3
cljk

この警告はWebComponentがログに記録する唯一のものであるため、ログをERRORレベルに上げるか、ログをオフにしてくださいこのコンポーネントの場合 logback.xmlで、またはログを構成した場所で。このコンポーネントからログに記録される他のメッセージがないため、この特定のメッセージを無視するためにカスタムフィルターを作成する必要はありません。

Org.glassfish.jersey.servlet.WebComponentバージョン2.14のソースコードスニペット:

        if(!form.asMap().isEmpty()) {
            containerRequest.setProperty("jersey.config.server.representation.decoded.form", form);
            if(LOGGER.isLoggable(Level.WARNING)) {
                LOGGER.log(Level.WARNING, LocalizationMessages.FORM_PARAM_CONSUMED(containerRequest.getRequestUri()));
            }
        }

この警告メッセージに使用されるローカライズされたメッセージは次のとおりです。

form.param.consumed=A servlet request to the URI {0} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

次のように、logback.xmlでWebComponentのログをオフにします。

<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>
2
afenkner

正しい。したがって、私はこの問題に苦しんでおり、さまざまな方法で解決しようとしていますが、web.xml設定を変更したくありませんでした。しかし、それがwebappと統合されていた場合、前述の問題(A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

@clijkで述べたように、ヘッダーを次のように設定するだけです。

"Content-Type":"application/json"
"charset":"UTF-8"

そして、ボイラー、それがなくなった警告。

ありがとう

1
facundofarias

これをリソースの署名に追加します。または、@ PUTまたは@POSTが使用されている場合は、プロジェクトでこの文字列を誰かがすでに使用していることを確認してください。これは役立つはずです

import javax.ws.rs.Consumes;

@Consumes(MediaType.APPLICATION_JSON)
0
Johnny Cage

私の場合、メソッドでオブジェクトDateStringに変更したときにこのエラーを修正しました。

エラー:

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception {

修繕

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception {
0
ferreirabraga