2013-07-07 36 views
6

Tôi đang sử dụng Jersey để tạo JSON (với ánh xạ POJO qua Jackson) và Jetty (bắt đầu từ phương thức chính).
Nó hoạt động hoàn hảo cho Jersey 1.x .:Không thể bật hỗ trợ ràng buộc JSON dựa trên POJO cho Jackson ở Jersey 2.0

ServletHolder sh = new ServletHolder(ServletContainer.class); 
sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", 
         "com.sun.jersey.api.core.PackagesResourceConfig"); 
sh.setInitParameter("com.sun.jersey.config.property.packages", "service"); 
sh.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); 
... 
context.addServlet(sh, "/rest/*"); 
Server server = new Server(8080); 
server.setHandler(context); 
server.start(); 

Bây giờ tôi đã di chuyển dự án của tôi để Jersey 2.0 và thất bại trong việc cho phép POJO dựa JSON ràng buộc trong nó, tôi nhận được như sau: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class business.entity.ExampleEntity, genericType=class business.entity.ExampleEntity.

Rõ ràng , com.sun.jersey.api.json.POJOMappingFeature không còn giá trị như Jersey đi vào org.glassfish

các documentation nói như sau:

Để sử dụng Jackson làm nhà cung cấp JSON (JAXB/POJO), bạn cần đăng ký JacksonFeature và ContextResolver cho ObjectMapper (nếu cần) trong Configurable (máy khách/máy chủ) của bạn.

Nhưng tôi không thể tìm ra cách thực hiện chính xác trong trường hợp của mình.

Tôi tạo ra một chút project cho câu hỏi này:

chi nhánh master - làm việc ví dụ cho Jersey 1.17.1;

chi nhánh jersey-2.0-migration - không cố gắng chuyển sang Jersey 2.0 - kiểm tra không thành công;

chi nhánh jersey-2.0-migrate-client-only - nỗ lực không hoạt động để sử dụng máy khách Jersey 2.0 với máy chủ Jersey đang hoạt động 1.17.1 - kiểm tra không thành công.

Câu hỏi là: làm thế nào để kích hoạt tính năng POJO dựa JSON binding trong Jersey 2,0

Trả lời

15

Các tài liệu là một chút lỗi thời. Bản dựng mới nhất của Jackson cung cấp một nhà cung cấp tự động phát hiện. Thêm lọ sau vào đường dẫn lớp:

1) jackson-chú thích-2.2.2.jar

2) jackson-core-2.2.2.jar

3) jackson-DataBind-2.2 .2.jar

4) jackson-jaxrs-base-2.2.1.jar

5) jackson-jaxrs-json-cung cấp-2.2.1.jar

6) jackson-module- jaxb-annotations-2.2.2.jar

Đảm bảo thêm "com.fasterxml.jackson.jaxrs.json" vào thuộc tính cấu hình servlet "jersey.config.server.provider.packages", vì vậy nhà cung cấp Jackson Jackson có thể được tự động phát hiện.

+0

Nó phù hợp với tôi! Cảm ơn nhiều! Tôi đã thêm hai nhánh mới vào [project] nhỏ của tôi (https://github.com/halfstrik/Jersey20Migration/tree/jersey-2.0-migration-success) trên GitHub 'jersey-2.0-migrate-server-success' và' jersey -2.0-migration-success' họ mô tả giải pháp và nó đã vượt qua kiểm tra! – Strikki

+0

Tôi cũng có thể làm việc với 'jersey-media-json-jackson 2.0' (xem cập nhật tại' jersey-2.0-migration'), nhưng không có 'jersey-client 2.0', nó nhận được cảnh báo như đã đề cập trong [comments] (http: //stackoverflow.com/a/16993761/846325) – Strikki

+0

Giờ đau khổ đã biến mất. Moxy đã không im lặng và tôi phải quay lại Jackson và tôi đã sẵn sàng đặt đầu qua cửa sổ. Cảm ơn câu trả lời này. – JSager

3

Cá nhân tôi thích nhận xét/câu trả lời của @ jontro ... vì vậy tôi sẽ đăng lại câu trả lời thay vì nhận xét để mọi người không bỏ lỡ nó (hy vọng điều đó là ok).

Hãy xem https://github.com/FasterXML/jackson-jaxrs-providers nơi có các nhà cung cấp jackson jaxrs mới (từ dự án jackson thay vì dự án jersey).

Lưu ý rằng điều này mang đến phụ thuộc Jackson2 (jackson-core-2.2.3.jar, v.v.) thay vì phụ thuộc Jackson1 mà jersey-media-json-jackson mang lại (jackson-core-asl-1.9.13.jar, v.v.).

Đối với dự án maven tôi sử dụng jersey 2.5 này chuyển thành:

Tháo phụ thuộc:

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.5.1</version> 
</dependency> 

Thêm phụ thuộc:

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.2.3</version> 
</dependency> 

Nhờ @ user2562639 và @jontro.

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