2012-09-10 38 views
10

jerseyとiのフォームからデータを取得しようとしていますが、これは簡単な作業ですが、何かPOSTしようとするとエラーが発生します。Jersey 2.0を使用してフォームをPOSTする方法

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()アノテーションを追加しようとしましたが、実際には動作させることはできません。私は誰かが私に手を差し伸べることを望む。

+0

トライ消費します(アプリケーション/ x-www-form-urlencodedで) – basiljames

+0

私が試してみましたが、同じ結果を持っていました。 – XFCC

答えて

9

ありがとうございました。いくつかのコードレビューで私は問題を発見した。他の誰かがこのような間違いを犯すとは思わないが、今後の参考のために投稿していきます。

問題は、標準のWebサーバーを使用していないことでした。私はJerseyを使ってネットサーバーを実装しましたが、問題はその実装にありました。問題は、私が必要としているように、私がJerseyにHTTPリクエストでヘッダを渡していないということでした。私は操作の途中でContent-Typeを失っていました。つまり、Jerseyはメッセージタイプを特定できませんでした。

jerseyを使用して非標準のサーバーを実装しようとしているときに、同様の問題を抱えている人のために:メディアタイプを正しく渡さないと(getMediaType()メソッドがContentRequest @FormParamが使用されているときにContent-Typeを検証するために使用されるクラス)では、このタイプのExceptionを取得します。

はここでも、助けのためのあなたのすべてに感謝:)

+0

この回答は役に立ちましたか?http://blog.junctiontv.com/wp/?p = 150 – Dudi

+0

あなたはどのようにしたのかの例を教えてもらえますか? – Wax

+0

まあ、それは5年前であり、私は詳細を覚えていません。あなたの質問は、ジャージーをネットティに縛ることですか? – XFCC

1

入力を「primary_id」と指定していますが、@FormParmアノテーションに「id」という名前が付けられています。あなたの入力タグのidとnameを "id"に変更してください。

はまた、あなたがあなたのformタグにこの属性を追加し、アプリケーション/ x-www-form-urlencodedで消費している場合:ENCTYPE = "アプリケーション/ x-www-form-urlencodedで"

+0

私は助けに非常に感謝していますが、 "primary_id"はタイプミスでした。私もカールで試してみました。私は少し必死になってきている。私もenctype = "application/x-www-form-urlencoded"で試してみました。運がない。 – XFCC

+0

奇妙なこと..すべてのライブラリが同じバージョン(例:1.13)であることを確認してください。 –

+0

実際、私がタイトルで言ったように、私はジャージー2.0を使用しています。とにかく私は誰も同じような問題を抱えているとは思わないのに、私が将来参照するために投稿する問題を発見しました:) – XFCC

3

あなたのコードは除いて正常に動作していますあなたは、デフォルトではこの方法は、私はあなたのコードをテストしてきたし、それはここで完全に正常に動作しているmediaType="application/x-www-form-urlencoded" .

消費削除、あなたは@Consumesを(定義haventはので)

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

を変更する必要があります。私の提案は、あなたのjerseyファイルをチェックすることです。あなたのlibフォルダにある特にjsersey-server.jarファイル。

+0

本当にあなたが言ったことはすべて本当であり、私は助けに感謝します。他のクラスをチェックしたところ、問題が見つかりました。 – XFCC

関連する問題