10

ジャージーを使用してフォームからデータを取得しようとしていますが、簡単に実行できますが、何かを投稿しようとするとエラーが発生します。

Caused by: java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.ensureValidRequest(FormParamValueFactoryProvider.java:126)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.getForm(FormParamValueFactoryProvider.java:111)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.get(FormParamValueFactoryProvider.java:94)
at org.glassfish.jersey.server.internal.inject.AbstractHttpContextValueFactory.provide(AbstractHttpContextValueFactory.java:65)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:80)
... 36 more

これがスタックトレースの関連部分だと思います。今私が使用しているコードのために:

@POST
@Path("/delete")
@Produces("application/json")
public String delete(@FormParam("id")String id){

そして、次のようなテスト html ページを使用して POST しようとしています。

<form action="<path to the server>/delete" method="post">
    primary_id: <input type="text" name="primary_id" /><br />
    <input type="submit" value="Submit" />
</form>

私はそれを機能させようとしてきましたが、チャンスはありません。multipart-form-data で @Consumes() アノテーションを追加しようとしましたが、実際には機能しません。誰かが私に手を貸してくれることを願っています。

4

3 に答える 3

10

助けてくれてありがとう。いくつかのコードをレビューすると、問題が見つかりました。他の誰かがこの特定の間違いを犯すとは思いませんが、将来の参考のためにとにかく投稿します.

問題は、標準の Web サーバーを使用していないことです。私はJerseyでnettyサーバーを実装しましたが、問題はその実装にありました。問題は、HTTP リクエストのヘッダーを Jersey に渡さなければならなかったことです。操作の途中で Content-Type を失っていました。これは、Jersey がメッセージ タイプを識別できなかったことを意味します。

したがって、将来の参考のために、jersey を使用して非標準サーバーを実装しようとしているときに同様の問題を抱えている人のために: メディア タイプを正しく渡さない場合 (使用される ContentRequest クラスに getMediaType() というメソッドがあります) 、とりわけ、 @FormParam が使用されているときに Content-Type を検証するために)、このタイプの例外が発生します。

繰り返しますが、助けてくれてありがとう:)

于 2012-09-12T10:21:04.853 に答える
3

変更する必要があることを除いて、コードは正常に機能しています

<input type="text" name="id" />

@Consumes() を定義していないため、デフォルトで削除メソッドは消費しますmediaType="application/x-www-form-urlencoded" .

あなたのコードをテストしましたが、ここでは問題なく動作しています。私の提案は、jersey jar ファイル、特に lib フォルダー内の jsersey-server.jar ファイルを確認することです。

于 2012-09-11T09:44:52.540 に答える
1

入力に「primary_id」という名前を付けていますが、@FormParm アノテーションで「id」名を受け取っています。入力タグの ID と名前を「id」に変更します。

また、application/x-www-form-urlencoded を使用している場合は、次の属性をフォーム タグに追加します: enctype="application/x-www-form-urlencoded"

于 2012-09-10T19:52:45.677 に答える