如何使用Jersey 2.0发布表单

时间:2012-09-10 17:24:59

标签: java html rest jersey jax-ws

我试图从带有球衣的表格中获取一些数据,虽然这是一项很容易完成的任务,但是当我尝试发布一些内容时,我收到了错误。

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()注释,但不能真正使它工作。我希望有人能帮助我。

3 个答案:

答案 0 :(得分:9)

谢谢大家的帮助。通过一些代码审查,我发现了问题。即使我认为没有其他人会犯这个特别的错误,我也会发布它以备将来参考。

问题是我没有使用标准的Web服务器。我已经用Jersey实现了一个netty服务器,问题出在那个实现上。问题是我没有按照我的要求将HTTP请求中的标头传递给Jersey。我在操作过程中丢失了Content-Type,这意味着Jersey无法识别消息类型。

因此,为了将来参考,对于在尝试使用jersey实现非标准服务器时遇到类似问题的任何人:当您没有正确传递媒体类型时(在ContentRequest类中有一个名为getMediaType()的方法除了其他方面,在使用@FormParam时验证Content-Type,你会得到这种类型的Exception。

再次感谢大家的帮助:)

答案 1 :(得分:3)

您的代码工作正常,除非您需要更改

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

由于你没有定义@Consumes(),默认情况下delete方法会消耗mediaType="application/x-www-form-urlencoded" .

我已经测试了你的代码,它在这里工作得非常好。我的建议是检查您的jersey jar文件特别是lib文件夹中的jsersey-server.jar文件。

答案 2 :(得分:1)

您将输入命名为“primary_id”,但您在@FormParm注释中收到“id”名称。将输入标记中的ID和名称更改为“id”。

此外,如果您正在使用application / x-www-form-urlencoded,请将此属性添加到您的表单标记中:enctype =“application / x-www-form-urlencoded”