2012-03-17 3 views
0

С Джерси, я в настоящее время использую библиотеку Gson для преобразования моего pojo в json взад и вперед. Однако я обнаружил, что Джексон намного быстрее, поэтому мы переходим к этому.jersey jackson несколько провайдеров для того же типа

У меня уже есть пользовательский поставщик и считыватель Gson, и теперь вы создадите (модифицированную) версию для Jackson.

Но во время разработки было бы хорошо, если бы я мог их поменять, но возможно ли это? Поскольку я помещаю json-провайдер в @produces и @consumes, я не думаю, что Джерси может решить, какой из них использовать, если есть два провайдера, каждый из которых имеет вышеупомянутые аннотации для одного и того же типа, в данном случае APPLICATION_JSON.

Можно ли указать несколько поставщиков Json, а затем поменять их в каком-либо файле конфигурации (web.xml?)?

Я знаю, что если бы я создал объект Json Wrapper, я мог бы скомпоновать интерфейс и использовать Spring для быстрой смены реализаций (jackson imp vs gson imp), но это означало бы, что я не делал бы этого пути Jax RS. Кроме того, я был бы вынужден вернуть String для всех GET, а не позволить провайдерам преобразовывать его для меня неявно.

Любые мысли?

благодаря

+0

Какую версию Gson вы используете? Gson 2.1 быстрее, чем Джексон для некоторых документов. –

+0

Я использую Gson 1.7.1. Я не знал, что 2.1 улучшилось. Я должен взглянуть. – user983022

ответ

4

Если вы создаете свой собственный подкласс ResourceConfig (или JAX-RS Application), то есть метод getClasses() - вот где вы должны вернуть набор ресурсов и поставщиков классов, которые ваши использования приложений , Теперь, кажется, вы используете некоторые из предварительно упакованных ResourceConfig - у Джерси есть ResourceConfig, который выполняет сканирование с помощью класса (т. Е. Если вы настроите его один или ни один - поскольку этот по умолчанию), он сканирует весь путь класса для классов ресурсов). Существует один способ сканирования пакетов, который сканирует только пакеты, которые вы перечисляете в своих начальных параметрах сержанта Джерси, и т. Д.

На самом деле, сканирование пакетов может быть лучше всего для вас. Просто убедитесь, что вы помещаете каждого из своих поставщиков JSON в другой пакет, а затем настраиваете в web.xml, какие пакеты следует сканировать для ресурсов и поставщиков. Вот пример web.xml, который конфигурирует Джерси искать ресурсы и поставщиков в com.mycompany.resource и com.mycompany.providers.gson пакетов:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    <servlet> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>com.sun.jersey.config.property.packages</param-name> 
      <param-value>com.mycompany.resources,com.mycompany.providers.gson</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Jersey Web Application</servlet-name> 
     <url-pattern>/webresources/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

спасибо Мартину. Ваши комментарии дают полезную информацию. – user983022

2

Если бы проблема, как это с несколькими зарегистрированными поставщиками но никто не использовал. Добавьте параметр init для определения того, какой провайдер пользователю, например

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 
Смежные вопросы