JAX-RS вложенный GenericEntity - PullRequest
0 голосов
/ 30 мая 2018

У меня есть служба JAX-RS 2.0, которая должна возвращать список объектов неизвестного типа.Более того, я хочу, чтобы этот список был вложен в объект-оболочку.Так, например, я хотел бы получить такой вывод:

{ "objects": [ {"name":"goofy"}, {"name":"mickey"} ] }

Если бы тип объектов был известен, это простая задача.Я пытался разными способами, включая использование GenericEntity, однако не могу найти решение.

Я использую WAS Glassfish 4.1, однако мне бы хотелось, чтобы решение не зависело от конкретной WAS.

Этоявляется соответствующим фрагментом кода службы:

@GET
@Path("{entity}")
public Response find(@PathParam("entity") String entity) {
    Class clazz = someMethod(entity);
    List list = someMethod(clazz);   //return a list of object of clazz
    WrapperClass wrapper = new WrapperClass();
    wrapper.setObjects(list);
    return Response.ok().entity(wrapper).build();
}

Этот код выводит в качестве вывода:

{ "objects": [ "object goofy", "object mickey" ] }

, т.е. объекты не сериализуются должным образом.

1 Ответ

0 голосов
/ 06 июня 2018

В Glassfish 4 поставщиком JSON по умолчанию является MOXy, который построен поверх JAXB.С JAXB типы сущностей должны быть известны заранее.Таким образом, результат, который вы получаете, это просто значение toString(), которое является поведением, когда тип не известен.

Если вы хотите переключиться на использование Джексона в качестве поставщика JSON, оно должно работать.Джексону не нужно заранее знать тип, поскольку он просто анализирует все свойства компонента.Чтобы использовать Джексона в Glassfish, вам нужно добавить зависимость в ваш проект и зарегистрировать JackonFeature в приложении.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey.version}</version>
    <scope>provided</scope>
</dependency>
...