2014-02-05 2 views
0

Первый раз здесь, но долго читатель ... Я вращал свои колеса на этом и с трудом находил способ кое-что сделать, используя Jackson и Wink, чтобы очертить набор объектов, которые отправляются над. По какой-то причине HashSet в этом не может быть корректно отображен. Вот пример: у меня есть объект Foo, который является сущностью в DAO. Я могу сериализовать и охарактеризовать отдельный объект Foo, который содержит Sets и List и т. Д., Без проблем. Вот мой Foo объект:Deserlize Set in jackson via Rest

[{"uuid":"1","version":1,"salutation":null,"firstName":"Random1","lastName":"Dude1"}, 
{"uuid":"2","version":1,"salutation":null,"firstName":"Random2","lastName":"Dude2"}] 

То, что я пытался сделать это в службе Rest с помощью Wink и Джексон. Пример ниже:

@Resource 
BarManager barManager 

@PUT 
@Path("{id}") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Bar addFoosForBar(@PathParam("id") String id, Set<Foo> foos) { 
Bar bar = barManager.getById(id); 
bar.addFoos(foos); 
return barManager.update(bar); 
} 

Это пример код и barManager.getById (ID) является находкой ресурсом (@Resource аннотированным) объекты извлекает бар. Методы «addFoos» добавляют набор Foo to Bar или в этом случае добавляют foos к рассмотренной панели. В этом коде foos в службе отдыха возвращаются, и я могу проверить foos, и он выглядит точно как объект json, но я получаю исключение »java.lang.ClassCastException: java.util.LinkedHashMap нельзя отнести к com.model.Foo «Когда я пытаюсь использовать foos в качестве набора, т. Е. Пытаюсь выполнить итерацию и т. Д. Мой вопрос: может ли Джексон десериализовать набор объектов, которые являются сущностями, или вам нужно определить отдельный тип объекта, который представляет собой набор объектов, конкретно как карту для использования Джексоном? Подводя итог, как Джексон учитывает HashSets определенных объектов для десериализации? Не удалось зажечь плавкий предохранитель в направлении, чтобы принять это, потому что это должно быть прямо, что я просто хочу десериализовать набор и иметь возможность манипулировать им в службе отдыха как POJO.

+0

Что вы ожидаете? Как должна быть вызвана ваша функция-пример? Укажите формат ввода, например, например, запрос JSON. –

+0

Добавлены некоторые пояснения к этому сервису отдыха, но просто нужно обновить панель с набором foos, чтобы ответить на ваш первый вопрос. Это вызывается через URL-адрес по адресу @Path ("{id]"), в этом случае служба отдыха. Формат ввода выше в полезной нагрузке, переданной от клиента. Если я проверяю foos внутри JVM, он выглядит точно так же, как и выше JSON-объект. – aheschel

ответ

0

Вот что я сделал, чтобы уничтожить множество известных сущностей в Джексоне. используется ObjectMapper и определяется на каждом остальных услуг, как показано ниже, например:

@Resource 
BarManager barManager 

ObjectMapper mapper = new ObjectMapper(); 

@PUT 
@Path("{id}") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public Bar addFoosForBar(@PathParam("id") String id, String foos) { 

HashSet<foos> foosSet = null; 
JavaType javaType = mapper.getTypeFactory().constructParametricType(HashSet.class, Foo.class); 
try { 
    fooSet = mapper.readValue(foos, javaType); 
} catch (IOException e) { 
e.printStackTrace(); 
} 

Bar bar = barManager.getById(id); 
bar.addFoos(foos); 
return barManager.update(bar); 
} 

Не самая большая работа, но будет делать трюк на создание множества, списки, и все, что на известном определенном классе с конструктором для Джексона. Надеюсь, это поможет кому-то.