Mam zamiar skonfigurować restaurację z Jersey. W tej chwili jestem trochę zdezorientowany o prawidłowej reprezentacji ciągów lub innych typów wartości w JSON. Oto dwa fragmenty:

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

Wywołanie tej metody w przeglądarce wyświetli "dobry" sznurek JSON w ten sposób:

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

Moja druga metoda wygląda tak:

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

Wywołanie tej metody w przeglądarce wyświetli czysty ciąg bez żadnych JSON-Stuff (Kręcone szelki itp):

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

Chcę spożywać tę usługę z narzędzi do Dojo. Problem polega na tym, że dostaję drugą metodę, gdy tylko ustawię [Rękojeści: "JSON"] - flaga. Rzuca mi błąd "SyntaxError: nieoczekiwany token H" gdzie "H" to pierwsza litera zwróconego ciągu.

Więc: Jaka jest poprawna reprezentacja sznurków i innych typów wartości i jakich adnotacji muszę ustawić do mojej metody, aby je wyprodukować?

14
Reini 18 wrzesień 2012, 16:12

3 odpowiedzi

Najlepsza odpowiedź

Powinieneś zdefiniować DTO i umieść w tym String. Więc będziesz mieć klasę HelloResp z jednym ciągiem jako atrybut. W swojej metodzie wypełnia ten atrybut i powrót.

Możesz sprawdzić to samouczek. Inny Tutorial.

Firefox nie pokazuje błędu, ponieważ nie przetwarzanie odpowiedzi. Cokolwiek zostanie zwrócone według usługi. Zestaw narzędzi rozpoczyna jednak przetwarzanie response jako JSON, ale nie był ważnym JSON (JSON zaczyna się od {)

5
basiljames 18 wrzesień 2012, 12:25

Możesz także zwrócić go jako:

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

Ale wygląda dla mnie bardzo dziwne.

Tworzenie DTO dla każdego obiektu również wygląda dziwnie dla jednego ciągu.

Czy jest jakakolwiek lepsza opcja?

2
SiMet 22 sierpień 2013, 09:32

Jeśli zwracasz sznur, dlaczego definiujesz go jako typ JSON?

Wystarczy zwrócić go jako zwykły tekst (meditype.text_plain):

@GET
@Path("hello/{name}")
@Produces( MediaType.TEXT_PLAIN)
public String hello(@PathParam("name") String name) {
    return "Hello " + name + ", it is " + new Date();
}
2
Pau 26 październik 2015, 15:12