2012-07-08 12 views
11

Ho 2 domande:REST. Jersey. Come scegliere a livello di programma quale tipo restituire: JSON o XML?

1. Posso creare una classe, annotare con annotazioni JAXB (per il supporto XML) e dichiaro in web.xml

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

per JSON (Jackson biblioteca) supporto? O ho bisogno di creare separatamente due classi per JSON e XML?

Oppure può esistere un modo più elegante per far sì che il servizio REST restituisca sia JSON che XML?

2. Come posso scegliere a livello di codice quale tipo restituire (JSON o XML)?

Grazie.

risposta

7

Se il client desidera utilizzare una parte dell'URL per configurare il tipo di risposta, è possibile utilizzare un filtro servlet.

Un modo semplice per implementare sovrascrivendo la rappresentazione (tipo di supporto) potrebbe usare un parametro di query URL:?

/risorse/todo format = json

Il filtro Servlet analizza i parametri di query URL, e se un formato = json è presente, sostituisce o aggiunge l'intestazione di accettazione "application/json".

+0

grazie, ma posso configurare il tipo di risposta unsing oggetto 'Response' quando ritorno dal metodo? – MyTitle

+4

La risposta può specificare il tipo di contenuto: return Response.ok. (...) .type ("application/json"). build(); – mjn

+3

Se sei schizzinoso su URL come I am ..., potresti usare un'estensione di file: '/ resources/todo.json' o'/resources/todo.xml' – Webnet

4

Non c'è bisogno di classi separate, cosa avete bisogno è metodi separati:

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

Poi nel lato client, quando si richiede per il servizio, si indica in quale formato si desidera:

// 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

grazie, così ho capito che ho bisogno di inviare 'accept' colpo di testa da cliente per ottenere che tipo ho bisogno. Ma come posso restituire il tipo neccesario dal server? – MyTitle

+0

Una volta aggiunta l'annotazione producess, il framework lo farà automaticamente per te in base alla richiesta del cliente – Tomer

+0

ok ok :) Lo capisco) Ma cosa succede se voglio tornare tipo neccesary a seconda di alcuni altri fatti (non sul client 'accetta 'header)? O in ither words, come restituire 'xml' se l'intestazione' accept' del client è JSON? – MyTitle

9

Nota: Sono il lead EclipseLink JAXB (MOXy) e un membro del gruppo di esperti JAXB (JSR-222).


Posso creare una classe, annotare con annotazioni JAXB (per il supporto XML) e dichiarare in web.xml per (biblioteca Jackson) supporto JSON?

si può sempre utilizzare una classe Application per specificare un MessageBodyReader/MessageBodyWriter per il legame della JSON. Credo che Jackson fornisca un'implementazione nel suo barattolo. Di seguito è riportato un esempio di una classe Application che specifica Moxy come provider 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; 
    } 

} 

Oppure avrei bisogno di creare separatamente due classi per JSON e XML?

EclipseLink JAXB (moxy) offre XML nativo vincolante ed è progettato per consentire di utilizzare il same object model for both JSON and XML.È possibile integrare nella vostra applicazione JAX-RS utilizzando la classe MOXyJsonProvider:


Come posso scegliere il tipo di programmazione per tornare (JSON o XML)?

Server Side

È possibile specificare che il servizio offre sia i messaggi JSON utilizzando il @Produces annotazioni XML e.

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

Per ulteriori informazioni

lato client

È possibile utilizzare il MediaType per indicare il tipo di messaggio. Di seguito è riportato un esempio utilizzando le API client di Jersey. Nota come l'URL è lo stesso, solo il tipo di media richiesto è diverso.

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

Per ulteriori informazioni

Problemi correlati