2015-01-20 13 views
5

Chúng tôi đã có một ứng dụng JAX-RS chạy trên Apache TomEE. Chúng tôi hơi tùy chỉnh nhà cung cấp Jettison mặc định để tuân thủ tốt hơn các quy ước JSON được sử dụng bởi giao diện người dùng JavaScript. TomEE cho phép để làm điều đó thông qua tập tin resources.xml của nó:Tùy chỉnh JSON marhsalling bằng GlassFish v4

<resources> 
    <Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
     serializeAsArray = true 
     dropRootElement = false 
     arrayKeys = members,roles 
     supportUnwrapped = true 
     writeXsiType = false 
    </Service> 
</resources> 

Bây giờ chúng ta chuyển sang GlassFish v4.1, và chúng tôi nhận thấy rằng JSON đầu ra khác với những gì chúng tôi đã có trong TomEE - do đó frontend hoàn toàn phá vỡ. Tôi đang tìm cơ chế tương tự để tùy chỉnh trình soạn thảo JSON trong GlassFish. Trong thực tế, tôi đã có một chút stuck với Jersey, MOXy, Jackson, Jettison. Làm cách nào để chúng tôi biết nhà cung cấp JSON nào thực sự được sử dụng? Làm thế nào để chúng ta chọn một? Làm cách nào để tùy chỉnh hành vi?

Ứng dụng này là JAX-RS thuần túy và không trực tiếp sử dụng bất kỳ bộ xử lý JSON nào, thay vào đó dựa vào việc sắp xếp các lớp được chú thích của JAXB. Giới thiệu về bất kỳ phụ thuộc không phải JavaEE nào là không mong muốn, vì ứng dụng được dự định di chuyển trên các thùng chứa (TomEE, GlassFish, một số ngày WildFly). Phương pháp tập tin cấu hình, tương tự như TomEE, là thích hợp hơn; cách lập trình cũng có thể chấp nhận được - nhưng chỉ khi tính di động được duy trì.

Trả lời

2

Glassfish sử dụng MOXy làm nhà cung cấp mặc định. Bên trong nó các thư viện để xử lý Jackson, Jettison và MOXy, nhưng mặc định là MOXy. Có hai cách để tắt MOXy

  1. Đặt thuộc tính Jersey jersey.config.server.disableMoxyJson thành true.
  2. Đăng ký XxxJsonFeature khác để vô hiệu hóa MOXy. Ví dụ: JacksonFeature đi kèm với jersey-media-json-jackson

Lưu ý rằng Glassfish đi kèm với nhà cung cấp Jackson, nhưng đó là Jackson 1.x. Nếu bạn muốn sử dụng 2.x, thay vì sử dụng jersey-media-json-jackson phụ thuộc liệt kê ở trên, nó sẽ là tốt hơn để sử dụng cơ bản cung cấp phụ thuộc Jackson, đó là

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

Bạn có thể đăng ký JacksonJsonProvider hoặc JacksonJaxbJsonProvider cho JAXB hỗ trợ chú thích.

Để định cấu hình Jackson, cách dễ nhất để triển khai ContextResolver, như đã thấy trong this answer. JacksonJsonProvider sẽ tra cứu số ContextResolver này để truy xuất ObjectMapper được sử dụng để (de) tuần tự hóa.

Bạn cũng cần phải nhớ tắt MOXy, như đã đề cập ở trên.

Một điều cần lưu ý là giải pháp này di động. Với JAX-RS, chỉ có cấu hình ứng dụng di động là thông qua một Application lớp con

@ApplicationPath("/api") 
public class MyApplication extends Application {} 

Điều đó đang được nói, việc vô hiệu hoá MOXY trong trường hợp Glassfish, là gì khác hơn là thiết lập một tài sản. Trong lớp Application, bạn có thể ghi đè getProperties() trả về một số Map<String, Object>. Đây là nơi bạn có thể đặt thuộc tính.Và bởi vì nó không có gì hơn một String (không có phụ thuộc bên ngoài), nó vẫn còn di động

@ApplicationPath("/api") 
public class MyApplication extends Application { 
    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> props = new HashMap<>(); 
     props.put("jersey.config.server.disableMoxyJson", true); 
     return props; 
    } 
} 

Theo như sự phụ thuộc ở trên, nó cũng là một giải pháp di động. Nó không có gì (JAX-RS) thực hiện cụ thể. Công cụ này triển khai và sử dụng các API JAX-RS tiêu chuẩn

+0

Tìm hiểu về 'jersey.config.server.disableMoxyJson' đưa tôi đến một ngày. Cuối cùng tôi đã có nhà cung cấp Gson của tôi làm việc. Cảm ơn! –

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