java json web-services moxy jersey-2.0

java - Jersey 2.0 equivalente a POJOMappingFeature



json web-services (6)

En realidad, simplemente funcionó para mí, con el parámetro PojoMappingFeature omitido.

Caminante a:

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

cede este 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>

punto de entrada:

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); } }

bean a 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); } }

Tengo cierta experiencia con Jersey <2.0. Ahora estoy tratando de construir una aplicación de guerra para proporcionar una API de servicio web JSON.

Ahora estoy luchando por una cantidad considerable de tiempo tratando de configurar Moxy y parece ser mucho más complicado de lo que estaba agregando

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

a su web.xml en Jersey <2.0.

¿Hay alguna posibilidad de decir "por favor, agregue el soporte json"?

Actualmente solo recibo muchos errores de Internal Server Error sin entradas de registro en el servidor y solo pienso "Tengo que hacer algo totalmente incorrecto, esto no puede ser tan difícil"

¿Alguien puede darme una pista?


Encontré esto funcionando bien, y fue el más fácil para resolver el problema (AFAIT)

Incluya la dependencia a continuación en su pom.xml / incluya el archivo JAR respectivo en la ruta de la lib

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

Enlace aquí


Puede configurar EclipseLink MOXy como proveedor de enlace JSON configurando la clase MOXyJsonProvider través de una clase de Application JAX-RS.

Ejemplo 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; } }

Ejemplo 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; } }

Para más información


Si quiere definirlo en su archivo web.xml, entonces:

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>

Y si usa maven agregue la siguiente dependencia a su archivo 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>


Simplemente use @XmlElement en lugar de @XmlAttribute (¡solo el atributo recibe el prefijo @, posiblemente reinicie el servidor de la aplicación para cambiar el efecto!)


Utilice la dependencia a continuación que lo hará automáticamente por usted.

<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.2.3</version> </dependency>