Джерси Джексон несколько провайдеров для одного типа - PullRequest
0 голосов
/ 18 марта 2012

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

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

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

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

Есть мысли?

спасибо

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Если вы создаете свой собственный подкласс ResourceConfig (или приложения JAX-RS), у него есть метод с именем 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>
2 голосов
/ 09 ноября 2012

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

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>
...