JAX-RS - JSON без корневого узла - PullRequest
6 голосов
/ 29 января 2011

У меня есть спокойный веб-сервис, и ответ:

{
    "cities": [{
        "id": "1",
        "name": "City 01",
        "state": "A1"
    }, {
        "id": "2",
        "name": "City 02",
        "state": "A1"
    }]
}

Но я хочу это:

{
    [{
        "id": "1",
        "name": "City 01",
        "state": "A1"
    }, {
        "id": "2",
        "name": "City 02",
        "state": "A1"
    }]
}

Как я могу настроить JAX-RS для производства JSON без корневого узла, используя только функцию JAX-RS, а не особенность реализации? Мой код должен быть переносимым на любой сервер приложений.

Ответы [ 3 ]

4 голосов
/ 29 января 2011

У меня была такая же проблема с Glassfish v3.Я обнаружил, что это поведение зависит от реализации JAX-RS, и переход на реализацию JAX-RS компании Codehaus решил для меня проблему.

Если вы также используете Glassfish, то вы можете решить эту проблему, добавивorg.codehaus.jackson.jaxrs к вашей войне, а также к конфигурации WEB-INF/web.xml следующим образом:

<!-- REST -->

<servlet>
  <servlet-name>RESTful Services</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
    <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
  </init-param>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>you.service.packages;org.codehaus.jackson.jaxrs</param-value>
    <!-- NOTE: The last element above, org.codehaus.jackson.jaxrs, replaces the default
       JAX-RS processor with the Codehaus Jackson JAX-RS implementation. The default
       JAX-RS processor returns top-level arrays encapsulated as child elements of a
       single JSON object, whereas the Jackson JAX-RS implementation return an array.
    -->
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>RESTful Services</servlet-name>
  <url-pattern>/your/rest/path/*</url-pattern>
</servlet-mapping>

В качестве альтернативы, вы можете просто перехватить ответ в клиенте:

function consumesCity(json) {
   ...
}

Заменить

... consumesCity(json) ...

на

function preprocess(json) {
    return json.city;
}

... consumesCity(preprocess(json)) ...
1 голос
/ 30 января 2011

Хороший вопрос. У меня было требование, подобное этому. Я должен был иметь доступ к сгенерированному необработанному ответу и сделать некоторые манипуляции. Я добился этого, зарегистрировав резонансный фильтр, а затем адаптировав собственный reponsewriter. См. Ссылку ниже для получения более подробной информации.

http://www.mentby.com/paul-sandoz/access-to-raw-xml-in-jersey.html

В вашем фильтре ответов вы можете вырезать имя класса из сгенерированного json или, что еще лучше, вернуть String в ответ и использовать собственный механизм сериализации json, такой как Google-gson.

Дайте мне знать, если это решение работает.

0 голосов
/ 27 августа 2012

Ответ от Ким Бургаард выше работает также для Джерси Спринг WS. У меня была та же проблема с использованием Glassfish 3.0, и я решил ее, добавив параметр, показанный ниже.

Пример web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>org.codehaus.jackson.jaxrs</param-value>
<!--             NOTE: The last element above, org.codehaus.jackson.jaxrs, replaces the default
               JAX-RS processor with the Codehaus Jackson JAX-RS implementation. The default
               JAX-RS processor returns top-level arrays encapsulated as child elements of a
               single JSON object, whereas the Jackson JAX-RS implementation return an array.-->
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Spring Web Application</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

Пример applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <!--  Scan for both Jersey Rest Annotations and persistence classes  -->
    <context:component-scan base-package="your.service.packages"/>
</beans>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...