2012-09-18 17 views
10

Estoy a punto de configurar un servicio REST-Web con Jersey. Por el momento, estoy un poco confundido acerca de la representación correcta de cadenas u otros tipos de valores en JSON. Éstos son dos fragmentos:Devolución de la representación JSON de una cadena con Jersey

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

llamar a este método en un navegador mostrará una "buena" cadena JSON así:

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

Mi segundo método es el siguiente:

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

Llamar a ese método en Browswer mostrará una cadena pura sin JSON-Stuff (llaves, etc.):

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

Quiero consumir este servicio con el kit de herramientas dojo. El problema es que obtengo un para el segundo método tan pronto como establezco [handleAs: "json"] - flag. Me arroja un error "SyntaxError: Token inesperado H" donde "H" es la primera letra de la cadena devuelta.

Entonces: ¿Cuál es la representación json correcta de cadenas y otros tipos de valores y qué anotaciones tengo que establecer para que mi método produzca estos?

Respuesta

5

Debe definir un DTO y poner su String en eso. Por lo tanto, tendrá una clase HelloResp con un atributo String como. En su método rellene ese atributo y regrese.

Puede consultar este Tutorial. Otro tutorial.

Firefox no muestra el error porque no está procesando su respuesta. Lo que devuelve el servicio se muestra. El kit de herramientas sin embargo empieza a procesar la Reponse como JSON, pero no hizo un JSON válida (JSON comienza con {)

+0

es mejor crear un DTO para cada operación o para crear un DTO para cada tipo que quiero usar? – Reini

+0

DTO para cada tipo – SiMet

+1

"JSON comienza con {" - Incorrecto. De acuerdo con http://json.org incluso un literal de cadena citado es JSON válido, y jersey debería ser compatible con la serialización correcta de una cadena como una cadena JSON. – ddumont

2

También puede devolverlo como:

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

pero es un aspecto muy extraño para mí.

Crear DTO para cada objeto también parece extraño solo para una cadena.

¿Hay alguna opción mejor?

+0

¿Puede explicar por qué está utilizando una comilla doble? ("") en lugar de simplemente: ¿devuelve "Algo"? Tengo un problema con eso y no entiendo por qué una cadena regular no se está convirtiendo en una respuesta json válida. – user1386966

+0

La razón es que esto devuelve la aplicación MediaType Json y puede devolver manualmente json como "{\" a \ ": 1} "que no es una cadena. Ver respuesta aprobada – SiMet

1

Si devuelve un String, ¿por qué lo define como un tipo JSON?

Sólo devolverlo como un texto plano (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(); 
} 
Cuestiones relacionadas