2013-04-07 13 views
7

Używam aplikacji Jackson (w Jersey) do przekształcania obiektów na części i przenoszę się z wersji Jackson 1.9 do wersji 2.0. Poszłam za this guide i początkowo wydawało mi się, że wszystko dobrze się układało.Aktualizacja do wersji Jackson 2.0 z wersji 1.9 na serwerze Jersey nie działa

Ale bliżej przyjrzeć się, że Jackson 1.9 nadal jest używany do serializacji moich odpowiedzi, a zatem ignorując moją (przeniesioną) adnotację Jackson 2.0. Można zobaczyć, które adnotacje używam w następujący fragment kodu:

@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(); 
} 

Moi @JsonIgnore getters są coraz odcinkach, a mój ObjectIdJsonSerializer nie jest wykorzystywana dla pola objectID.

Podczas debugowania widzę, że używana jest ObjectMapper z wersji 1.9.

Usunąłem wszystkie zależności od bezpośrednich mavenów do Jacksona 1.9 i próbowałem dodawać wykluczenia do jersey-json, aby zapobiec wciągnięciu Jacksona 1.9. Ale nie mogę się tego całkowicie pozbyć (przez umieszczenie wykluczenia na wszystkich elementach codehaus.jackson w moim zarządzaniu zależnościami), ponieważ używam także Spring AMQP, który potrzebuje Jackson 1.9.

Wszelkie pomysły na zarządzanie tym produktem? Czy ktoś napotkał/rozwiązał podobny problem? Jak zmusić Jersey do używania Jackson 2.0?

Odpowiedz

8

Odpowiadam na moje własne pytanie, oparte na (użytecznych) odpowiedziach od StaxMana i pgelinów.

Musiałem zrobić dwie rzeczy, aby działało.

Pierwszą rzeczą było usunięcie com.sun.jersey.api.json.POJOMappingFeature z mojego pliku web.xml.

Drugim było zaktualizować Jackson-jaxrs-json-provider (rzeczywiście, wszystkie moje artefaktów Jackson) do 2.1.

Z wersją 2.1 lub 2.0 oraz POJOMappingFeature, Jackson 1.9 nadal był używany do serializacji.

Po usunięciu wersji 2.0 i POJOMappingFeature otrzymałem komunikat o błędzie brakującego treści wiadomości.

Po usunięciu elementów 2.1 i POJOMappingFeature wszystko działało zgodnie z oczekiwaniami.

2

Chciałbym dokładnie sprawdzić, czy nie masz obu wersji Jacksona w swojej klasie. Nazwy pakietów w Jackson 2.x zostały zmienione na com.fasterxml z org.codehaus. W ten sposób nie masz jakiegoś tajemniczego problemu z classpath (jak NoClassDefFound), ale jeśli nie używasz odpowiednich pakietów, to jest to rodzaj zachowania, które zobaczysz.

Ponadto adnotacje zostały wyodrębnione do własnego projektu, jackson-annotations.

+0

Nie używam Maven i wymieniłem wszystkie artefakty org.codehaus z ich wersjami fasterxml. Użyłem [tego przewodnika] (http://www.cowtowncoder.com/blog/archives/2012/04/entry_469.html) do przeprowadzenia migracji. – Eyal

+2

To zrozumiałem. Mówię tylko, że być może inny projekt (Jersey?) Może zawierać Jackson 1.x jako zależność przechodnią i dodać go do ścieżki klasy, i być może ta wersja jest używana jako dostawca JAX-RS. Jeśli dobrze pamiętam, możliwe jest sprawdzenie zależności projektu z mavenem, powinieneś go użyć. –

+0

Jersey przynosi stare zależności Jacksona, ale wydaje się, że są to czasy kompilacji, więc nie jestem pewien, czy to problem. Na pewno to sprawdzę, oczywiście :-) – Eyal

5

Nie wystarczy po prostu zaktualizować wersje jądra i mapera Jacksona; integracja między Jersey (lub jakąkolwiek implementacją JAX-RS) a Jacksonem odbywa się przy użyciu konkretnego dostawcy JAX-RS. Dla Jacksona byłby to https://github.com/FasterXML/jackson-jaxrs-json-provider.

Musisz także dodać 2. dostawcę Jackson JAX-RS JSON, a to sprawi, że Jersey użyje Jackson 2.x do swojej działalności.

-1

nawet jeśli uaktualnisz do jacksona 2, będziesz mieć błąd NoClassfound jako wiosnę, używając starego jacksona.

Sprawdź realizacja wiosna na ten link: http://git.springsource.org/sandbox/cbeams/blobs/4731d671cbeb82b87dd0f10e16cd09d8f267b433/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/json/MappingJacksonJsonView.java

+0

Może to dotyczyć Spring MVC (zgodnie z opublikowanym linkiem), ale nie używam go, tylko inne pakiety Spring. – Eyal

Powiązane problemy