2012-07-08 25 views
11

tengo 2 preguntas:RESTO. Jersey. Cómo elegir mediante programación qué tipo devolver: ¿JSON o XML?

1. ¿Puedo crear una clase, anotar con anotaciones JAXB (XML) para el apoyo y declaro en web.xml

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

para JSON (biblioteca de Jackson) ¿apoyo? ¿O necesito crear por separado dos clases para JSON y XML?

¿O puede existir una manera más elegante de hacer que el servicio REST devuelva JSON y XML?

2. ¿Cómo puedo elegir mediante programación qué tipo devolver (JSON o XML)?

Gracias.

Respuesta

7

Si su cliente desea usar una parte de la URL para configurar el tipo de respuesta, puede usar un filtro de servlet.

Una manera fácil de implementar anulando la representación (tipo de papel) podría utilizar un parámetro de consulta URL:?

/recursos/todo format = json

El filtro de servlet analiza los parámetros de consulta de URL, y si un formato = json está presente, reemplaza o agrega el encabezado de aceptación "application/json".

+0

gracias, pero ¿puedo configurar el tipo de respuesta unsing 'objeto' Response' cuando regrese del método? – MyTitle

+4

La respuesta puede especificar el tipo de contenido: return Response.ok. (...) .type ("aplicación/json"). build(); – mjn

+3

Si eres exigente con las URL como soy ..., podrías usar una extensión de archivo: '/ resources/todo.json' o'/resources/todo.xml' – Webnet

4

No hay necesidad de clases separadas, lo que necesita es métodos separados:

@GET 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public Todo getXML() { 
    Todo todo = new Todo(); 
    todo.setSummary("This is my first todo"); 
    todo.setDescription("This is my first todo"); 
    return todo; 
} 

Luego, en el lado del cliente, cuando se solicita el servicio, deberá indicar en qué formato desea que:

// Get XML 
System.out.println(service.path("rest").path("todo").accept(MediaType.TEXT_XML).get(String.class)); 
// Get XML for application 
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_XML).get(String.class)); 
// Get JSON for application 
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_JSON).get(String.class)); 
+0

gracias, por lo que entiendo que necesito enviado 'accept' cabecera de cliente a conseguir lo que necesito tipo. Pero, ¿cómo puedo devolver el tipo necesario del servidor? – MyTitle

+0

Una vez que agrega la anotación de producto, el marco lo hará automáticamente en función de la solicitud del cliente – Tomer

+0

ok ok :) Lo entiendo) Pero, ¿qué ocurre si deseo devolver el tipo necesario según otros datos (no en el 'encabezado)? O en otras palabras, ¿cómo devolver 'xml' si el encabezado' accept' del cliente es JSON? – MyTitle

9

Nota: Soy el líder EclipseLink JAXB (MOXy) y miembro del grupo de expertos JAXB (JSR-222).


¿Puedo crear una clase, hacer anotaciones con las anotaciones JAXB (XML) para el apoyo y declarar en web.xml para (biblioteca de Jackson) el apoyo JSON?

siempre se puede utilizar una clase Application para especificar un MessageBodyReader/MessageBodyWriter para la unión del JSON. Creo que Jackson proporciona una implementación en su jar. A continuación se muestra un ejemplo de una clase Application que especifica moxy como el proveedor de JSON:

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

} 

O necesito para crear por separado dos clases de JSON y XML?

EclipseLink JAXB (moxy) Ofrece vinculante XML nativo y está diseñado para que pueda utilizar el same object model for both JSON and XML.Puede integrarlo en su aplicación JAX-RS utilizando la clase MOXyJsonProvider:


¿Cómo puedo elegir qué tipo mediante programación para volver (JSON o XML)?

lado del servidor

Puede especificar que el servicio ofrece tanto XML y JSON mensajes utilizando la anotación @Produces.

@GET 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
@Path("{id}") 
public Customer read(@PathParam("id") long id) { 
    return entityManager.find(Customer.class, id); 
} 

Para más información

lado del cliente

Puede utilizar el MediaType para indicar el tipo de mensaje. A continuación se muestra un ejemplo con las API de cliente de Jersey. Tenga en cuenta que la URL es la misma, solo que el tipo de medio solicitado es diferente.

Client client = Client.create(); 
WebResource resource = client.resource("http://localhost:8080/CustomerService/rest/customers"); 

// Get XML response as a Customer 
Customer customer = resource.path("1") 
    .accept(MediaType.APPLICATION_XML) 
     .get(Customer.class); 
System.out.println(customer.getLastName() + ", "+ customer.getFirstName()); 

// Get JSON response as a Customer 
Customer customer = resource.path("1") 
    .accept(MediaType.APPLICATION_JSON) 
     .get(Customer.class); 
System.out.println(customer.getLastName() + ", "+ customer.getFirstName()); 

Para más información

Cuestiones relacionadas