2015-01-20 4 views
5

У нас есть приложение JAX-RS, работающее на Apache TomEE. Мы немного настраиваем поставщика Jettison по умолчанию, чтобы лучше придерживаться соглашений JSON, используемых интерфейсом JavaScript. TomEE позволяет сделать это через свой файл resources.xml:Настройка JSON marhsalling с 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> 

Теперь мы мигрируют в GlassFish v4.1, и мы замечаем, что выход JSON отличается от того, что мы имели в TomEE - таким образом, полностью отключающая внешний интерфейс. Я ищу аналогичный механизм для настройки маршаллера JSON в GlassFish. На самом деле, я уже немного stuck с Джерси, МОКСИ, Джексоном, Джеттисон. Как мы узнаем, какой поставщик JSON фактически используется? Как мы его выбираем? Как мы настраиваем поведение?

Приложение является чистым JAX-RS и не использует никакой JSON-процессор напрямую, вместо этого полагаясь на сортировку классов, аннотированных JAXB. Внедрение любых зависимостей, отличных от JavaEE, крайне нежелательно, так как приложение предназначено для переноски по контейнерам (TomEE, GlassFish, в какой-то день WildFly). Предпочтительным является метод Config-file, аналогичный TomEE; также допустим программный путь, но только при сохранении переносимости.

ответ

2

Glassfish использует MOXy как поставщик по умолчанию. Внутренне это имеет библиотеки для обработки Jackson, Jettison и MOXy, но по умолчанию MOXy. Есть два способа отключения Moxy

  1. Установить свойство Джерси jersey.config.server.disableMoxyJson в true.
  2. Зарегистрировать другое XxxJsonFeature что отключает MOXy. Например JacksonFeature, который поставляется с jersey-media-json-jackson

Обратите внимание, что Glassfish поставляется с провайдером Джексона, но Джексон 1.х. Если вы хотите использовать 2.x, вместо использования jersey-media-json-jackson зависимости перечисленных выше, было бы лучше использовать лежащую в основе Джексона зависимость поставщика, который

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

Вы можете зарегистрировать JacksonJsonProvider или JacksonJaxbJsonProvider для JAXB поддержка аннотаций.

Чтобы настроить Джексон, самый простой способ реализовать ContextResolver, как видно из this answer. JacksonJsonProvider будет искать это ContextResolver для извлечения ObjectMapper, используемого для (де) сериализации.

Вам также необходимо будет отключить MOXy, как указано выше.

Также следует отметить, что это решение является портативным. С JAX-RS, только портативные конфигурации приложения через Application подкласса

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

, как говорится, это отключение Moxy в случае Glassfish, это не более, чем значение свойства. В классе Application вы можете переопределить getProperties(), который возвращает Map<String, Object>. Здесь вы можете установить свойство.И потому, что это не S не более чем String (нет внешних зависимостей), остается портативным

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

Насколько выше Джексона зависимость, это также портативное решение. Это ничего не значит (JAX-RS). Он реализует и использует стандартные API JAX-RS

+0

Вывод о 'jersey.config.server.disableMoxyJson' взял меня как день. Наконец, у меня работает мой оператор Gson. Благодаря! –

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

  • Нет связанных вопросов^_^