2013-07-31 3 views
5

Il client/browser effettua una richiesta JSON alla mia risorsa di riposo (il tipo di contenuto della richiesta è application/json e il metodo REST corrispondente è @Consumes("application/json") annotato).Ottieni semplice parametro JSON da una richiesta JSON in JAX-RS

@Path("/process-something") 
@POST 
@Produces("application/json") 
@Consumes("application/json") 
@HandleDefaultExceptions 
public AResponse processSomething(List<Long>) { 

} 

Il corpo JSON è costituito da alcuni tipi semplici, come List<Long> o String.

C'è una semplice possibilità di ottenere i parametri JSON iniettati semplicemente annotandoli in qualche modo, in modo simile a @FormParam nel caso di una richiesta application/x-www-form-urlencoded? Vorrei alcune altre soluzioni più semplici della decodifica della stringa JSON con Jackson ObjectMapper o Jettison's JSONObject.

+0

quale quadro che si sta utilizzando per l'attuazione jaxrs?, Ci sono molti quadri là fuori che forniscono supporto JSON anche se solo l'annotazione non è sufficiente, si dovrà mappare i fornitori adeguati, ma quello non è un grosso problema. Segnala Jersey, Apache CXF – Sikorski

+0

Jersey è quello che uso. Spero che con Mapping non intendi creare ObjectMapper o altre istanze di oggetti (vedi l'ultima parte della domanda) ... –

+1

no, voglio dire che dovrai fornire una voce in web.xml o qualche altro file di configurazione che dirà alla maglia di usare il supporto JSON. vedi questo: https://jersey.java.net/documentation/latest/media.html#json - E queste sono le soluzioni più facili! – Sikorski

risposta

4

È possibile creare una classe Java che rifletta il modello dati del proprio oggetto JSON e annotarlo con @XmlRootElement di JAXB. È possibile mappare gli attributi per personalizzato JSON nome della chiave con annotazioni @XmlElement, ad es .:

@XmlRootElement 
public class MyJSONOject{ 
    @XmlElement(name="json-key-name") 
    public String attribute; 
} 

Poi Jersey possibile decodificare l'oggetto JSON per voi in modo trasparente e voilà!

@Path("/process-something") 
@POST 
@Produces("application/json") 
@Consumes("application/json") 
public AResponse processSomething(MyJSONOject json) { 
    log.fine(json.attribute); 
} 
+1

Anche se mi aspettavo un modo più semplice, come ottenere il parametro iniettato con un'annotazione (vedi la mia risposta), contrassegno questo come una risposta, poiché questa è ancora una soluzione migliore che decodificarla manualmente con Jackson. –

1

Secondo this documentation ci sono 6 annotazioni basate su parametri utilizzate per estrarre i parametri da una richiesta e nessuno sembra essere per i parametri JSON.

+0

perché hai scritto questo come risposta? – Sikorski

+1

Perché questa potrebbe essere la risposta ... almeno non ci sono annotazioni nello standard JAX-RS che estrae il parametro JSON. –

+0

cosa pensi che @Consumes ("application/json") faccia? – Sikorski