2013-09-16 3 views
2

У меня есть следующие POJO:десериализация JSON в объект с HashMap, используя Джерси 2,2

public class Reservation { 
    private String name; 
    private BigDecimal price; 
    private ArrayList<HashMap<String, Object>> products; 
    ...getters & setters for all fields.... 
} 

и этот простой Java-Джерси REST ресурс:

@POST 
@Consumes({MediaType.APPLICATION_JSON}) 
public String insert(Reservation re) { 
    //do something here with ReservationEntity 
} 

Когда я запрос POST со следующим данные:

{ 
    "name":"michal", 
    "price":1234.3, 
    "products":[ 
    {"id":1, "desc":"qwerty"}, 
    {"id":2, "desc":"ytrewq"} 
    ] 
} 

Я ожидаю получить объект класса Бронирование со списком продуктов из данных JSON. Однако я получаю объект, который имеет только имя и цену. Продукты ArrayList пустые.

Я пытался использовать org.codehaus.jackson.map.ObjectMapper для десериализации данных JSON как это:

String data = "{\"name\":\"micha\".....}"; 
ObjectMapper om = new ObjectMapper(); 
Reservation re = om.readValue(data, Reservation.class); 

После этого объекта повторно были две записи (HashMaps) в ArrayList продуктах, как ожидалось. Я не люблю использовать объект mapper таким образом, поэтому я спрашиваю, как это сделать только с Джерси. Я прочитал много статей по этим вопросам, большинство из них посоветовали поставить в web.xml, как это:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>org.foobar.rest.services;org.codehaus.jackson.jaxrs</param-value>  
</init-param> 

Это не работа для меня тоже. Я даже не имею какое-либо заявление в моем web.xml

Я использую: - Glassfish 4,0 - Джерси 2,2

EDIT: Я создал репозиторий с очень простым проектом на GitHub: Jersey22 Есть два метода POST в классе MyResource с путями:/рабочие и/notworking

Я оценил бы любой рабочий пример. Спасибо.

ответ

0

Я пытался именно ваш код в старом приложении моего, и я не сталкивался любой вопрос: весь объект быть десериализации без каких-либо проблем:

@POST 
@Consumes({ MediaType.APPLICATION_JSON }) 
public void getServices(Reservation reservation) { 
    System.out.println(reservation.getName()); 
    System.out.println(reservation.getPrice()); 
    ArrayList<HashMap<String, Object>> products = reservation.getProducts(); 
    for(HashMap<String, Object> product : products) { 
     System.out.println("Product:"); 
     for(Entry<String, Object> e : product.entrySet()) { 
     System.out.println(e.getKey() + " - " + e.getValue().toString());    
     } 
    } 
} 

Результат:

michal 
1234.3 
Product: 
id - 1 
desc - qwerty 
Product: 
id - 2 
desc - ytrewq 

поэтому я не могу понять, что происходит не так. В моем приложении я использовал Jersey 1.10 и Jackson 1.8.3, но, думаю, все будет хорошо с каждой версией Джерси и Джексона.

Если я могу предложить вам улучшение, которое также может решить вашу проблему, я бы создал новый объект для определения «продукта»; концептуально представляет собой объект. Возможно, более простой List<Product> будет десериализован без проблем.

+0

Спасибо Enrichman, я пробовал с Джерси 1.17.1, и все сработало хорошо. Мне пришлось поставить эту строку: com.mycompany.jersey17; org.codehaus.jackson.jaxrs в определение в web.xml. Я попытался сделать то же самое с Джерси 2.2, но не повезло .. –

+0

Я также попытался использовать Список , как предложил @Enrichman - я переместил HashMap в класс Product. После создания этого списка продуктов, но HashMap внутри продукта был пуст. –

+0

Я предлагаю вам объект Product, чтобы удалить HashMap и использовать просто простой идентификатор и описание в качестве поля продукта, кстати. Я загрузил ваш проект, теперь я немного поиграю с ним. :) – Enrichman

0

Действительно, он должен работать ...

Вы также можете попробовать Genson библиотеку, добавьте ее в путь к классам и он должен работать без каких-либо другой конфигурации.

0

Наконец-то у меня это работает.Я думаю, что важные шаги были:

  • добавить джерси-медиа-JSON-джексон Maven зависимостей
  • регистр Джексона при создании приложения JAX-RS по телефону: регистрация (JacksonFeature.class);
Смежные вопросы