java - 在 Jersey 客户端 API 中使用 BeanParam

标签 java web-services rest jersey jersey-client

在 Jersey API 文档中,有一个使用 Form 封装表单参数 POST 到服务的示例:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9998").path("resource");

Form form = new Form();
form.param("x", "foo");
form.param("y", "bar");

MyJAXBBean bean =
target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
    MyJAXBBean.class);

我想使用 BeanParam,而不是使用 Form 对象,它与传递到我的方法中的对象相同(即我的方法只是充当代理并重新发布到另一个服务)。所以类似:

@POST
@Path("/CallService")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response callService(@BeanParam final MyBean requestBean) {

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:9998").path("resource");

MyJAXBBean bean =
target.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(requestBean,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
    MyJAXBBean.class);
}

当我调用此端点时,我收到 MessageBodyProviderNotFoundException:

javax.servlet.ServletException: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/x-www-form-urlencoded, type=class MyBean, genericType=class MyBean.

MyBean 只是一个用 @XmlRootElement@XmlAccessorType(XmlAccessType.FIELD) 注释的 pojo,然后是一些带有 @FormParam("company")< 的字段.

看起来当创建帖子时,它不会调用 application/x-www-form-urlencoded 类型的提供程序...

最佳答案

"Instead of using a Form object, I want to use a BeanParam"

你不能。只需坚持使用表单即可。 @BeanParam 严格适用于服务器端,它甚至不仅仅适用于表单参数,它也适用于所有其他参数。重点是将它们组合在服务器端以方便访问。

当您尝试在客户端上发送 Bean 时。客户端查找可以处理 application/x-www-form-urlencodedMyBeanMessageBodyWriter。它不会找到一个,您将收到当前收到的错误。可用于 application/x-www-form-urlencodedMessageBodyWriter 可以处理 FormMultivaluedMap [1]

如果您确实想将数据作为 bean 发送,则将其作为 application/json 发送。除此之外,您只能使用 FormMultivaluedMap

[1] - 请参阅

关于java - 在 Jersey 客户端 API 中使用 BeanParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002670/

相关文章:

wcf - 为什么此 WCF 服务无法识别 UriTemplate 参数?

asp.net - 在 ASP.NET 上构建维基百科(学习练习)。如何清理不受信任的数据,但保持格式化?

java - 即使传递了 'true',@QueryParam boolean 值也会变为 false

mysql - 使用用户搜索参数生成 MySQL JSON_EXTRACT 条件

rest - 如何在Rest命令Delphi中转换CURL

java - 无法更新 PhoneGap Android 应用程序中的版本代码

Java让数组输出中的每个int都有逗号?

java - 访问存储在 .jar 中的 PDF 文件

javascript - Ajax post to Asmx 中缺少参数

c# - 将表达式从 C# 转换为 Java