2013-04-07 2 views
7

Я использую Jackson (в Джерси) для сериализации сущностей, и я перехожу от Jackson 1.9 до 2.0. Я последовал за this guide, и сначала казалось, что все получилось легко.Обновление до Jackson 2.0 от 1.9 на Джерси не работает

Но более пристальный взгляд показывает, что Jackson 1.9 по-прежнему используется для сериализации моих ответов и, следовательно, игнорирования моей (перенесенной) аннотации Jackson 2.0. Вы можете увидеть, какие аннотации я использую в следующем фрагменте кода:

@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public abstract class IdEntity { 

@Id 
@JsonDeserialize(using = ObjectIdJsonDeserializer.class) 
protected ObjectId id; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonSerialize(using = ObjectIdJsonSerializer.class) 
public ObjectId getId() { 
    return id; 
} 

public void setId(ObjectId id) { 
    this.id = id; 
} 

@JsonIgnore 
public String getIdAsString() { 
    return id == null ? "" : id.toString(); 
} 

Мои @JsonIgnore добытчиками становятся сериализовать, и мой ObjectIdJsonSerializer не используется для ObjectId поля.

В отладке я вижу, что используемый ObjectMapper - 1,9.

Я удалил все прямые зависимости maven с Jackson 1.9 и попытался добавить исключения к jersey-json, чтобы предотвратить его вытаскивание в Jackson 1.9. Но я не могу полностью избавиться от него (добавив исключение ко всем файлам codehaus.jackson в моем управлении зависимостями), потому что я также использую Spring AMQP, которому нужен Jackson 1.9.

Любые идеи о том, как управлять этим? Кто-нибудь сталкивался/решал аналогичную проблему? Как заставить Джерси использовать Jackson 2.0?

ответ

8

Я отвечаю на свой вопрос, основываясь на (полезных) ответах от StaxMan и pgelinas.

Мне пришлось сделать две вещи, чтобы заставить ее работать.

Первым делом было удалить com.sun.jersey.api.json.POJOMappingFeature с моего web.xml.

Второй обновить мой ДЖЕКСОН-jaxrs-JSon-провайдер (на самом деле, все мои артефакты Джексона) в 2.1.

С 2.1 или 2.0 и POJOMappingFeature Jackson 1.9 все еще использовался для сериализации.

С выпуском 2.0 и POJOMappingFeature у меня возникла ошибка с отсутствием сообщения об ошибке.

С удалением 2.1 и POJOMappingFeature все работает должным образом.

2

Я бы дважды проверял, нет ли у вас обеих версий Jackson в вашем пути к классам. Названия пакетов в Jackson 2.x были изменены на com.fasterxml от org.codehaus. Таким образом, у вас нет какой-либо загадочной проблемы с классом (например, NoClassDefFound), но если вы не используете соответствующие пакеты, это будет поведение, которое вы увидите.

Кроме того, аннотации были извлечены в их собственный проект, jackson-annotations.

+0

Нет, я использую Maven, и я заменил все org.codehaus артефакты с их соответствующими версиями fasterxml. Я использовал [это руководство] (http://www.cowtowncoder.com/blog/archives/2012/04/entry_469.html), чтобы выполнить миграцию. – Eyal

+2

Что я понял. Я хочу сказать, что, возможно, другой проект (Джерси?) Может включать Jackson 1.x в качестве транзитивной зависимости и добавить его в путь к классам, и, возможно, именно эта версия используется как поставщик JAX-RS. Если я правильно помню, можно проверить зависимости проекта с maven, вы должны это использовать. –

+0

Джерси несет в себе старые зависимости Джексона, но они, похоже, время компиляции, поэтому я не уверен, что это проблема. Конечно, я обязательно это проверю :-) – Eyal

5

Недостаточно просто обновить версии ядра Jackson и картпера; интеграция между Джерси (или любая реализация JAX-RS) и Джексон происходит с использованием конкретного поставщика JAX-RS. Для Джексона это будет https://github.com/FasterXML/jackson-jaxrs-json-provider.

Так что вам также нужно добавить 2.x Jackson JAX-RS JSON, и это заставит Джерси использовать Jackson 2.x для его работы.

-1

, даже если вы обновите до jackson 2, у вас будет NoClassfound ошибка, как весна, используя старый jackson.

Проверить выполнение пружины по этой ссылке: http://git.springsource.org/sandbox/cbeams/blobs/4731d671cbeb82b87dd0f10e16cd09d8f267b433/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/json/MappingJacksonJsonView.java

+0

Это может быть справедливо для Spring MVC (по ссылке, которую вы отправили), но я не использую его, только другие пакеты Spring. – Eyal

Смежные вопросы