J'ai déjà utilisé Jersey <2.0. Maintenant, j'essaie de créer une application war pour fournir une API de service Web JSON.
Cela fait maintenant beaucoup de temps que je me bats pour essayer de configurer Moxy et cela semble être bien plus compliqué que ce qui était ajouté
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
à votre web.xml dans Jersey <2.0.
Existe-t-il une possibilité de simplement dire "veuillez ajouter le support json"?
Actuellement, je reçois beaucoup d'erreurs de serveur internes sans aucune entrée de journal sur le serveur et je me dis que "je dois faire quelque chose de totalement faux, cela ne peut pas être si difficile"
Quelqu'un peut-il me donner un indice?
Vous pouvez configurer EclipseLink MOXy en tant que fournisseur de liaisons JSON en configurant la classe MOXyJsonProvider
par le biais d'une classe JAX-RS Application
.
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 n ° 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 plus d'informations
S'il vous plaît utilisez 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>
Si vous voulez le définir dans votre fichier web.xml, alors:
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>
En gros, cela a fonctionné pour moi, avec le paramètre PojoMappingFeature omis.
Aller à:
http://localhost:8080/webapi/myresource/complexObject/foo
donne ce 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'accès:
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);
}
}
haricot à 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);
}
}
J'ai trouvé que cela fonctionnait aussi et était le plus facile à résoudre (AFAIT)
Incluez la dépendance ci-dessous dans votre pom.xml/incluez le fichier JAR correspondant dans le chemin lib
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency
Utilisez simplement @XmlElement à la place de @XmlAttribute (seul l'attribut reçoit le préfixe @, redémarrez éventuellement votre serveur d'applications pour obtenir un effet modifié!)