【问题标题】:How to POST a form using Jersey 2.0如何使用 Jersey 2.0 发布表单
【发布时间】:2012-09-03 14:37:48
【问题描述】:

我正在尝试从带有球衣的表单中获取一些数据,虽然这将是一项容易完成的任务,但是当我尝试发布某些内容时出现错误。

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

【问题讨论】:

  • 尝试消费(application/x-www-form-urlencoded)
  • 我试过了,结果一样。

标签: java html rest jersey jax-ws


【解决方案1】:

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

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

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

再次感谢大家的帮助:)

【讨论】:

  • 你能举个例子说明你是怎么做到的吗?
  • 嗯,那是 5 年前的事了,具体细节我不太记得了。你的问题是关于将球衣绑定到 netty 还是我如何传递标题?
  • 当时,我为 netty 实现了一个处理程序,该处理程序将了解来自 jersey 的 ApplicationHandler。收到消息后,我阅读了请求,创建了一个 ContainerRequest(因为这是 Jersey 所期望的对象),然后通过我了解的 ApplicationHandler 处理应用程序级别。然后我有一个 netty ContainerResponseWriter 来处理对客户端的响应。关于标头,您应该查看由 ContainerRequest 扩展的球衣中的 InboundMessageContext,它可能会告诉您您需要什么。有什么我能帮忙的就问吧。
【解决方案2】:

您的代码运行良好,除非您需要更改

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

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

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

【讨论】:

  • 确实你说的都是真的,我感谢你的帮助。在检查了其他类后,我发现了问题。
【解决方案3】:

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

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

【讨论】:

  • 非常感谢您的帮助,但“primary_id”是一个错字。我也尝试过 curl 。我有点绝望了。我也尝试过 enctype="application/x-www-form-urlencoded"。没有运气。
  • 奇怪.. 确保所有库都是相同的版本(例如 1.13)。
  • 实际上,正如我在标题中所说,我使用的是球衣 2.0。无论如何,我发现了问题,我会将其发布以供将来参考,即使我真的不认为有人会遇到类似的问题 :)
猜你喜欢
  • 2013-08-07
  • 2013-06-21
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多