在 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-urlencoded
和 MyBean
的 MessageBodyWriter
。它不会找到一个,您将收到当前收到的错误。可用于 application/x-www-form-urlencoded
的 MessageBodyWriter
可以处理 Form
和 MultivaluedMap
[1]。
如果您确实想将数据作为 bean 发送,则将其作为 application/json
发送。除此之外,您只能使用 Form
或 MultivaluedMap
[1] - 请参阅
关于java - 在 Jersey 客户端 API 中使用 BeanParam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002670/