JsonTypeInfo не сериализуется при использовании Джексона с Джерси

Я аннотировал класс JAXB с помощью JsonTypeInfo, чтобы легко сериализовать полиморфные классы. Однако аннотация не отображается при сериализации Джерси. Чтобы быть более конкретным, он появляется при использовании ObjectMapper, но не как возвращаемый тип из ресурса. Я очень смущен прямо сейчас, так как это, кажется, проблема с взаимодействием Джерси => Джексон.

Для отладки я использовал пример jsonfromjaxb из jersey-samples, чтобы локализовать свою проблему. Я добавил следующее в класс Flights, чтобы сериализовать его в @class.

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")

У меня есть следующие методы, доступные в ресурсе, один из которых просто возвращает объект JAXB, а другой вручную использует ObjectMapper.

@GET
@Produces({"application/json"})
public synchronized Flights getFlightList() {
    return myFlights;
}

@GET
@Path("/object_mapper")
@Produces({"application/json"})
public synchronized String getFlights() throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(myFlights);
}

Результат запроса /jsonfromjaxb/flights

{"flight":[{"flightId":"OK123","company":"Czech Airlines","number":123,"aircraft":"B737"},{"flightId":"OK124","company":"Czech Airlines","number":124,"aircraft":"AB115"}]}

Результат запроса /jsonfromjaxb/flights/object_mapper

{"@class":"com.sun.jersey.samples.jsonfromjaxb.jaxb.Flights","flight":[{"number":123,"company":"Czech Airlines","aircraft":"B737","flightId":"OK123"},{"number":124,"company":"Czech Airlines","aircraft":"AB115","flightId":"OK124"}]}

Спасибо, Рэнсом


person Ransom Briggs    schedule 04.02.2011    source источник


Ответы (1)


Я думаю, похоже, что вы не используете сериализацию на основе Джексона (то есть ту, которая использует ObjectMapper; низкоуровневый генератор Джексона используется для большинства выходных данных JSON, включая те, где привязка выполняется по-другому). Если бы вы были, это определенно должно выглядеть так, как вы видите при явном использовании. Так что, похоже, это вопрос изменения конфигурации Джерси JSON.

person StaxMan    schedule 05.02.2011
comment
Спасибо, это помогло - я вмешался с помощью отладчика, чтобы убедиться, что я использую библиотеки Джексона, - и очень полезно было указать, что он использует низкоуровневые, а не JAXB. Остальная часть решения добавляла следующее. - person Ransom Briggs; 07.02.2011
comment
‹init-param› ‹param-name›com.sun.jersey.api.json.POJOMappingFeature‹/param-name› ‹param-value›true‹/param-value› ‹/init-param› - person Ransom Briggs; 07.02.2011
comment
Хорошо, отлично - мне нужно иметь это в виду; Я думаю, что это в значительной степени часто задаваемые вопросы в некоторых списках рассылки (пользователь джерси) - person StaxMan; 07.02.2011