2013-04-07 27 views
7

Tôi đang sử dụng Jackson (ở Jersey) để sắp xếp các thực thể và tôi đang di chuyển từ Jackson 1.9 đến 2.0. Tôi đã theo dõi this guide và lúc đầu, dường như mọi thứ đã diễn ra dễ dàng.Nâng cấp lên Jackson 2.0 từ 1,9 ở Jersey không hoạt động

Nhưng một cái nhìn gần hơn cho thấy rằng Jackson 1.9 vẫn đang được sử dụng để sắp xếp các câu trả lời của tôi, và do đó bỏ qua chú thích Jackson 2.0 (di chuyển) của tôi. Bạn có thể xem chú thích Tôi đang sử dụng trong các đoạn mã sau:

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

getters @JsonIgnore tôi đang nhận được đăng, và ObjectIdJsonSerializer của tôi không được sử dụng cho các lĩnh vực ObjectId.

Trong gỡ lỗi, tôi có thể thấy rằng ObjectMapper đang được sử dụng là từ 1.9.

Tôi đã xóa tất cả phụ thuộc maven trực tiếp đối với Jackson 1.9 và đã thử thêm loại trừ vào jersey-json, để ngăn không cho nó kéo vào Jackson 1.9. Nhưng tôi không thể loại bỏ nó hoàn toàn (bằng cách đặt một loại trừ cho tất cả các công cụ codehaus.jackson trong quản lý phụ thuộc của tôi) bởi vì tôi cũng đang sử dụng Spring AMQP, cần Jackson 1.9.

Bất kỳ ý tưởng nào về cách quản lý điều này? Có ai gặp phải/giải quyết một vấn đề tương tự? Tôi buộc Jersey sử dụng Jackson 2.0 như thế nào?

Trả lời

8

Tôi trả lời câu hỏi của riêng mình, dựa trên câu trả lời (hữu ích) từ StaxMan và pgelinas.

Tôi phải làm hai việc để làm cho nó hoạt động.

Điều đầu tiên là xóa com.sun.jersey.api.json.POJOMappingFeature từ web.xml của tôi.

Thứ hai là để cập nhật tôi jackson-jaxrs-json-nhà cung cấp (trên thực tế, tất cả các hiện vật Jackson của tôi) để 2.1.

Với 2.1 hoặc 2.0 và POJOMappingFeature, Jackson 1.9 vẫn đang được sử dụng để tuần tự hóa.

Với 2,0, và POJOMappingTính năng bị xóa, tôi gặp lỗi cơ quan tin nhắn bị thiếu.

Với 2.1 và POJOMappingTính năng bị xóa, mọi thứ hoạt động như mong đợi.

2

Tôi sẽ kiểm tra kỹ nếu bạn không có cả hai phiên bản Jackson trong đường dẫn lớp của bạn. Tên gói trong Jackson 2.x đã được đổi thành com.fasterxml từ org.codehaus. Bằng cách này bạn không có một số vấn đề khó hiểu classpath (như một NoClassDefFound), nhưng nếu bạn không sử dụng các gói thích hợp này là loại hành vi mà bạn sẽ thấy.

Ngoài ra, chú thích được trích xuất vào dự án của riêng họ, jackson-annotations.

+0

Không, tôi đang sử dụng Maven và tôi đã thay thế tất cả các đồ tạo tác org.codehaus với các phiên bản fasterxml tương ứng của họ. Tôi đã sử dụng [hướng dẫn này] (http://www.cowtowncoder.com/blog/archives/2012/04/entry_469.html) để thực hiện việc di chuyển. – Eyal

+2

Điều đó tôi hiểu. Những gì tôi đang nói là có lẽ một dự án khác (Jersey?) Có thể bao gồm Jackson 1.x như một phụ thuộc quá độ và thêm nó vào classpath, và có lẽ đó là phiên bản này được sử dụng như là nhà cung cấp JAX-RS. Nếu tôi nhớ lại chính xác, có thể kiểm tra các phụ thuộc của một dự án với maven, bạn nên sử dụng nó. –

+0

Jersey mang đến các phụ thuộc cũ của Jackson, nhưng chúng dường như là thời gian biên dịch, vì vậy tôi không chắc đó là vấn đề. Tôi chắc chắn sẽ kiểm tra này ra, tất nhiên :-) – Eyal

5

Chỉ đơn giản là nâng cấp các phiên bản lõi và bản đồ của Jackson; tích hợp giữa Jersey (hoặc bất kỳ triển khai JAX-RS nào) và Jackson xảy ra bằng cách sử dụng nhà cung cấp JAX-RS cụ thể. Đối với Jackson, điều này sẽ là https://github.com/FasterXML/jackson-jaxrs-json-provider.

Vì vậy, bạn cũng cần thêm 2.x nhà cung cấp JSON JAX-RS JSON và điều đó sẽ khiến Jersey sử dụng Jackson 2.x để hoạt động.

-1

ngay cả khi bạn nâng cấp lên jackson 2, bạn sẽ gặp lỗi NoClassfound làm lò xo sử dụng jackson cũ.

Kiểm tra thực hiện vào mùa xuân vào liên kết này: http://git.springsource.org/sandbox/cbeams/blobs/4731d671cbeb82b87dd0f10e16cd09d8f267b433/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/json/MappingJacksonJsonView.java

+0

Điều này có thể đúng với Spring MVC (theo liên kết bạn đã đăng) nhưng tôi không sử dụng nó, chỉ các gói Spring khác. – Eyal

Các vấn đề liên quan