4

我必须将pojo发布到仅通过表单数据( MediaType.APPLICATION_FORM_URLENCODED )接受参数的服务器。我知道 jersey 客户端可以将对象转换为 xml、json 和其他类型,但尝试转换为 APPLICATION_FORM_URLENCODED 会出现异常,表明指定类型的正文编写器不可用。

有没有办法将对象序列化为 application_form_urlencoded MultivaluedMap,或者我必须手动逐个属性来形成结果 MultivaluedMap?根据问题上下文,创建适配器以使用球衣序列化在我看来并不是合适的解决方案。

POST 对象

@XmlRootElement
public class POSTableObject {
    private int a;
    private String b;

    public int getA() { return a; }
    public void setA(int a) { this.a = a; }
    public String getB() { return b; }
    public void setB(String b) { this.b = b; }
}

使用 Jersey 客户端发布操作

ClientResponse response = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, postableObject);
4

2 回答 2

5

JAX-RS 提供者只需要提供到application/x-www-form-urlencodedfor 的映射MultivaluedMap<String,String>。而且我很确定开箱即用的 Jersey 不会提供从application/x-www-form-urlencoded常规 POJO 到其他映射器的额外映射器。您可以编写自己的客户端提供程序,但根据您需要执行此操作的频率,您自己将 POJO 字段映射到 URL 字段可能更简单。

于 2013-02-19T18:19:30.013 回答
4

您可以这样做,但首先您必须基于映射服务预期参数的表单 (javax.ws.rs.core.Form) 创建一个实体 (javax.ws.rs.client.Entity):

Form input = new Form();
input.param("first_parameter", "value");
input.param("second_parameter", "value");
Entity<Form> entity = Entity.entity(input, MediaType.APPLICATION_FORM_URLENCODED);

ClientResponse response = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(entity);
于 2016-07-20T09:56:44.110 回答