Возвращение JSON-представления String с Джерси

Я собираюсь настроить REST-Webservice с Джерси. На данный момент я немного смущен правильным представлением строк или других типов значений в JSON. Вот два фрагмента:

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

Вызов этого метода в браузере отобразит "хороший" JSON String следующим образом:

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

Мой второй метод выглядит следующим образом:

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

Вызов этого метода в Browswer будет отображать чистую строку без каких-либо JSON-Stuff (Curly Braces и т.д.):

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

Я хочу использовать эту службу с помощью инструментария dojo. Проблема в том, что я получаю второй метод, как только устанавливаю флаг [handleAs: "json" ] -. Это вызывает ошибку "SyntaxError: Неожиданный токен H", где "H" - первая буква возвращаемой строки.

Итак: Какое правильное json-представление строк и других типов значений и какие аннотации я должен установить для своего метода для их создания?

Ответ 1

Вы должны определить DTO и поместить в него String. Таким образом, вы получите класс HelloResp с одним атрибутом String. В вашем методе заполните этот атрибут и верните его.

Вы можете проверить это Учебное пособие. Другой tutorial.

В Firefox не отображается ошибка, потому что она не обрабатывает ваш ответ. Отображается все, что возвращается службой. Инструментарий, однако, начинает обработку ответа как JSON, но не действительный JSON (JSON начинается с {)

Ответ 2

Вы также можете вернуть его как:

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

но для меня это выглядит очень странно.

Создание DTO для каждого объекта также выглядит странно только для одной строки.

Есть ли лучший вариант?

Ответ 3

Если вы возвращаете строку, почему вы определяете ее как тип JSON?

Просто верните его как обычный текст (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();
}