2013-02-19 3 views
4

я должен опубликовать POJO на сервер, который принимает только параметры с помощью данных формы (MediaType.APPLICATION_FORM_URLENCODED). Я знаю, что jersey-клиент может преобразовать объект в xml, json и другие типы, но попытка конвертировать в APPLICATION_FORM_URLENCODED дает исключение, показывающее, что для созданных типов нет создателя тела для указанных типов.POST с помощью клиента Джерси APPLICATION_FORM_URLENCODED MEDIATYPE

Есть ли способ сериализации объекта как 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; } 
} 

сообщение действий с использованием Джерси клиенту поставщиков

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

ответ

4

JAX-RS требуется только для обеспечения отображения на application/x-www-form-urlencoded для MultivaluedMap<String,String>. И я уверен, что из-за коробки Джерси не предоставляет дополнительный картограф от application/x-www-form-urlencoded до обычных POJO. Вы можете написать свой собственный клиентский провайдер, но в зависимости от того, как часто вам нужно это делать, может быть проще просто сопоставить поля POJO с полями URL самостоятельно.

+0

Печальные новости, я надеялся, что решение уже существует для этого – jmoreira

+0

Ну, это не популярный прецедент. POJO более естественно сопоставляется с многоуровневой картой, тогда как «application/x-www-form-urlencoded» действительно представляет собой карту одного уровня. – Perception

+0

Сопоставление многозначной карты достаточно для моего случая, я понимаю, что вы говорите, что это можно сделать не вручную? – jmoreira

1

Вы можете сделать это, но сначала вы должны создать Entity (javax.ws.rs.client.Entity) на основе формы (javax.ws.rs.core.Form), которая отображает параметры, ожидаемые службой :

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); 
Смежные вопросы