web-dev-qa-db-fra.com

Comment produire une sortie JSON avec Jersey 1.6 à l'aide de JAXB

@XmlRootElement
public class Todo {
    private String s = "test";

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }

}

et service:

@Path("/test")
public class Service {

    @GET
    @Produces({MediaType.APPLICATION_JSON })
    public List<Todo> getAllGadgets() {
        return Arrays.asList(new Todo[] { new Todo() });
    }

}

mon web.xml:

<servlet>
    <servlet-name>Jersey REST Service</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.test</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Tout cela fonctionne si je mets MediaType.APPLICATION_XML pour Produces annotation. Mais pour JSON, je reçois l'exception suivante:

GRAVE: exception mappée à la réponse: 500 (erreur de serveur interne) javax.ws.rs.WebApplicationException: com.Sun.jersey.api.MessageException: un rédacteur de corps de message pour Java classe Java.util .Arrays $ ArrayList et Java type Java.util.List et application/json de type de support MIME est introuvable

J'utilise Jersey 1.6 et, selon le tutoriel, le format JSON devrait fonctionner avec JAXB sans aucune programmation supplémentaire. Qu'est-ce qui ne va pas?

27
Mikhail

J'ai résolu ça. Tout ce que je devais faire était d'ajouter la bibliothèque jersey-json-1.6.jar au projet (ce n'est pas une partie obligatoire de jersey)

32
Mikhail

Ajoutez le paramètre suivant au servlet jersey dans le fichier web.xml, ceci est requis pour les dernières versions 1.x de jersey-servlet.

    <init-param>
        <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
14
Kamran

J'utilise Google App Engine et je me suis beaucoup débattu avec cela aussi, si vous utilisez jersey-bundle-1.17.jar la plupart des choses fonctionnent jusqu'à ce que vous ajoutiez

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

vous obtiendrez beaucoup de messages étranges. C'est parce que vous manquez quelques pots jackson. Si vous allez sur page d'accueil du maillot et téléchargez le Zip et le bundle. Déposez simplement le bundle et à partir du Zip, vous devez ajouter les 4 pots jackson dans votre chemin de classe et vous devriez tout faire fonctionner sans aucune erreur.

L'ajout de jackson-jaxrs-1.9.2.jar résout cette erreur ci-dessous

SEVERE: The registered message body writers compatible with the MIME media type are:
application/json ->

L'ajout de jackson-xc-1.9.2.jar résout ce problème ci-dessous

Java.lang.NoClassDefFoundError: org/codehaus/jackson/xc/JaxbAnnotationIntrospector

J'espère que cela aide quelqu'un.

6
Daniel

Les autres réponses n'ont pas fonctionné pour moi, mais j'ai finalement réussi à le faire fonctionner avec JSON.

J'utilisais le jersey-bundle-1.17.jar (également essayé avec asm-3.1.jar et jersey-json-1.17.jar ajoutés au classpath et ne fonctionnait toujours pas). J'ai finalement essayé de télécharger le Zip qui comprend 12 pots différents. Une fois que j'ai ajouté les 12 pots à mon chemin de classe, je me suis finalement débarrassé de l'erreur et fonctionne très bien en retournant JSON.

J'espère que cela aide quelqu'un.

Mise à jour: Voici un lien vers le fichier Zip qui contient les 12 fichiers jar: jersey-archive-1.17.Zip

Une autre mise à jour pour les utilisateurs Maven: Ajoutez ce qui suit à votre pom.xml pour obtenir les 12 pots individuellement:

    <dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>com.Sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-jaxrs</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-xc</artifactId>
        <version>1.9.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.1</version>
    </dependency>
6
11101101b

L'exception d'écriture de corps de message répertoriée par l'OP sera déclenchée si vous n'annotez pas votre POJO (ou POJO de base) avec @XmlRootElement.

Par exemple:

@XmlRootElement
public class BaseBean
{
    private Boolean success = Boolean.TRUE;
    private String message;

    /**
     * Empty constructor to satisfy requirements of JAXRS.
     */
    public BaseBean() {}

    /**
     * Returns a simple message to accompany the success/failure.
     * @return
     */
    public String getMessage()
    {
        return message;
    }

    /**
     * Sets the message (if required).
     * @param message
     */
    public void setMessage(String message)
    {
        this.message = message;
    }

    /**
     * Returns a flag indicating whether a request for content was
     * successful.
     * @return
     */
    public Boolean getSuccess()
    {
        return success;
    }

    /**
     * Marks the success of a request for content.
     * @param success
     */
    public void setSuccess(Boolean success)
    {
        this.success = success;
    }
}
0
Steven Wolfe

La réponse de Kamran a fonctionné pour moi, juste pour développer davantage le xml:

    <servlet>
    <servlet-name>JerseyServletContainer</servlet-name>
    <servlet-class>com.Sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
    <param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
    </init-param>
0
Sultan