2012-09-18 14 views
10

sto per impostare un REST-Webservice con Jersey. Al momento sono un po 'confuso riguardo la corretta rappresentazione di stringhe o altri tipi di valore in JSON. Qui ci sono due frammenti:Tornando alla rappresentazione JSON di una stringa con Jersey

@GET 
@Path("user") 
@Produces(MediaType.APPLICATION_JSON) 
public User user() { 
    return new User("reini", "admin"); 
} 

chiamata a questo metodo in un browser visualizzerà una "buona" String JSON così:

{"name":"reini","role":"admin"} 

mio secondo metodo è simile al seguente:

@GET 
@Path("hello/{name}") 
@Produces(MediaType.APPLICATION_JSON) 
public String hello(@PathParam("name") String name) { 
    return "Hello " + name + ", it is " + new Date(); 
} 

Chiamando questo metodo in un Browswer verrà visualizzata una stringa pura senza materiale JSON (bretelle ricurve, ecc.):

Hello firefox, it is Tue Sep 18 13:52:57 CEST 2012 

Desidero utilizzare questo servizio con il dojo toolkit. Il problema è che ottengo un secondo metodo non appena ho impostato [handleAs: "json"] - flag. Mi viene visualizzato un errore "SyntaxError: Unexpected token H" dove "H" è la prima lettera della stringa restituita.

Quindi: qual è la corretta rappresentazione JSON di stringhe e altri tipi di valori e quali annotazioni devo impostare per il mio metodo per produrle?

risposta

5

È necessario definire uno DTO e inserire il numero String in quello. Quindi avrai una classe HelloResp con una stringa come attributo. Nel tuo metodo, compila questo attributo e ritorna.

È possibile controllare questo Tutorial. Un altro tutorial.

Firefox non mostra errori perché non sta elaborando la risposta. Viene visualizzato ciò che viene restituito dal servizio. Il toolkit però inizia l'elaborazione del reponse come JSON, ma non ha fatto un JSON valido (JSON inizia con {)

+0

è meglio creare un DTO per ogni operazione o per creare un DTO per ogni tipo che voglio usare? – Reini

+0

DTO per ciascun tipo – SiMet

+1

"JSON inizia con {" - errato. Secondo http://json.org anche una stringa letterale quotata è JSON valida, e la jersey dovrebbe supportare serializzare correttamente una stringa come una stringa JSON. – ddumont

2

Si può anche tornare come:

@GET 
@Path("hello/{name}") 
@Produces(MediaType.APPLICATION_JSON) 
public String hello(@PathParam("name") String name) { 
    return "\"Hello " + name + ", it is " + new Date()+'"'; 
} 

ma è un aspetto molto strano per me.

La creazione di DTO per ogni oggetto sembra strana solo per una stringa.

C'è qualche soluzione migliore?

+0

Puoi spiegare perché stai usando un doppio preventivo? ("") invece di solo: restituire "Qualcosa"? Sto avendo un problema con quello e non capisco il motivo per cui una stringa regolare non è la conversione ad una risposta JSON valida – user1386966

+0

motivo è che questo restituisce MediaType applicazione JSON e si potrebbe manualy tornare un JSON come "{\" a \ ": 1} "che non è una stringa. Vedi risposta aperta – SiMet

1

Se si restituisce una stringa, perché la si definisce come un tipo JSON?

Proprio restituirlo come un testo normale (MediaType.TEXT_PLAIN):

@GET 
@Path("hello/{name}") 
@Produces(MediaType.TEXT_PLAIN) 
public String hello(@PathParam("name") String name) { 
    return "Hello " + name + ", it is " + new Date(); 
} 
Problemi correlati