Jersey 2.0 équivalent à POJOMappingFeature

j'ai de l'expérience avec Jersey < 2.0. Maintenant j'essaie de construire une application de guerre pour fournir une API Webservice JSON.

je me bats maintenant pour une quantité considérable de temps essayant de configurer Moxy et il semble être beaucoup plus compliqué que ce qui a été ajouté

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

pour votre site web.xml dos en Jersey < 2.0.

est-il possible de dire simplement "s'il vous plaît ajouter le support json"?

actuellement je reçois beaucoup de serveur interne Erreurs sans aucune entrée de log sur le serveur et il suffit de penser "je dois faire quelque chose de totalement erroné, cela ne peut pas être si difficile"

quelqu'un Peut-il me donner un indice?

31
demandé sur Frederick Roth 2013-07-10 14:38:08

6 réponses

Vous pouvez configurer EclipseLink MOXy comme le fournisseur JSON-binding en configurant le MOXyJsonProvider classe par le biais d'un JAX-RS Application classe.

exemple #1

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(MOXyJsonProvider.class);
        set.add(CustomerService.class);
        return set;
    }

}

exemple #2

package org.example;

import java.util.*;
import javax.ws.rs.core.Application;
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;

public class CustomerApplication  extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>(1);
        set.add(ExampleService.class);
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider();

        moxyJsonProvider.setAttributePrefix("@");
        moxyJsonProvider.setFormattedOutput(true);
        moxyJsonProvider.setIncludeRoot(true);
        moxyJsonProvider.setMarshalEmptyCollections(false);
        moxyJsonProvider.setValueWrapper("$");

        Map<String, String> namespacePrefixMapper = new HashMap<String, String>(1);
        namespacePrefixMapper.put("http://www.example.org/customer", "cust");
        moxyJsonProvider.setNamespacePrefixMapper(namespacePrefixMapper);
        moxyJsonProvider.setNamespaceSeparator(':');

        HashSet<Object> set = new HashSet<Object>(1);
        set.add(moxyJsonProvider);
        return set;
    }

} 

Pour En Savoir Plus Informations

7
répondu Blaise Doughan 2013-07-11 20:47:35

veuillez utiliser la dépendance ci-dessous qui le fera automatiquement pour vous.

 <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.3</version>
   </dependency>
42
répondu Kalaiselvam M 2013-11-25 06:41:43

si vous voulez le définir dans votre web.fichier xml puis:

JACKSON:

<init-param>
  <param-name>jersey.config.server.provider.classnames</param-name>
  <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>

MOXY

<init-param>
  <param-name>jersey.config.server.provider.classnames</param-name>
  <param-value>org.glassfish.jersey.moxy.json.MoxyFeature</param-value>
</init-param>

et si vous utilisez maven, ajoutez la dépendance suivante à votre fichier pom

JACKSON

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>your jersey version</version>
</dependency>

MOXY

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>your jersey version</version>
</dependency>
11
répondu ibai 2015-12-17 14:01:49

en fait, ça a juste marché pour moi, avec le param PojoMappingFeature omis.

Va:

http://localhost:8080/webapi/myresource/complexObject/foo

les rendements json:

{"name":"foo","value1":1374185178829,"value2":42}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<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>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.example</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

point d'entrée:

package com.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }

    @Path( "complexObject/{name}" )
    @GET
    @Produces( { MediaType.APPLICATION_JSON } )
    public ComplexObject complexObject( @PathParam( "name" ) String name ) {
        return new ComplexObject(name, System.currentTimeMillis(), 42L);
    }
}

fève de jsonize:

package com.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "text/plain" media type.
     *
     * @return String that will be returned as a text/plain response.
     */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getIt() {
        return "Got it!";
    }

    @Path( "complexObject/{name}" )
    @GET
    @Produces( { MediaType.APPLICATION_JSON } )
    public ComplexObject complexObject( @PathParam( "name" ) String name ) {
        return new ComplexObject(name, System.currentTimeMillis(), 42L);
    }
}
3
répondu marathon 2013-07-18 22:07:37

trouvé que cela fonctionne aussi bien, et était le plus facile à résoudre le problème (AFAIT)

incluez la dépendance ci-dessous dans votre pom.xml / sont fichier JAR dans le répertoire lib de chemin d'accès

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>0.99</version>
</dependency

Lien ici

2
répondu aksappy 2015-02-23 08:16:52

il suffit d'utiliser @XmlElement à la place de @XmlAttribute (seul l'attribut receives @ prefix, peut-être redémarrer votre applserver pour un effet modifié!)

0
répondu user2769792 2013-09-15 21:12:18