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页面进行发布:

<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

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

问题是我没有使用标准的网络服务器。我已经用 Jersey 实现了一个 netty 服务器,问题出在那个实现中。问题是我没有将 HTTP 请求中的标头传递给 Jersey。我在操作过程中丢失了 Content-Type,这意味着 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" .

我已经测试了你的代码,它在这里工作得很好。我的建议是检查你的球衣 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 回答