2012-10-16 8 views
7

Mam kod z interfejsu REST API, który używa @ResponseBody, aby zwrócić wynik, i MappingJacksonHttpMessageConverter, aby zwrócić go w formacie JSON.Spring @ResponseBody generuje nieprawidłowy JSON dla typów pierwotnych

Wszystko działa dobrze w przypadku złożonych obiektów. Dla prymitywów, takich jak int, boolean i string otrzymuję JSON, który nie zaczyna się od {lub [. To nie jest prawidłowy JSON.

Zastanawiałem się, jaki jest właściwy sposób zwrotu prostego typu? Czy należy hermetyzować go w obiekcie, takim jak { Result : true }?

Dzięki próbka

Kod:

@RequestMapping(
     value = "/login", 
     method = RequestMethod.POST) 
@ResponseBody 
public boolean Login(String username, String password) { 
    return authenticationService.authenticate(username, password); 
} 

ten powróci tylko true lub false który jest nieważny JSON. Powinien być zamknięty w obiekcie lub tablicy (jeśli dobrze rozumiem).

Odpowiedz

8

Po prostu zwraca true lub false. I masz rację, że to nie jest json.

Nie może być jsonem, ponieważ nie jest obiektem, jest po prostu prymitywny, więc jest tak dobry, jak jest - zostanie przypisany do zmiennej javascript w twojej procedurze obsługi sukcesu.

Jeśli zwróci listę wartości logiczne masz tablicę:

[true,false,true] 

Jeśli musisz mieć w pełni ukształtowany json nie zwracają prymitywne wykorzystanie HashMap lub zwyczaj wrapper obiektu.

public 
@ResponseBody 
Map<String, Boolean> getTrue() { 
    Map<String, Boolean> map = new HashMap<String, Boolean>(1){{put("result", Boolean.TRUE);}}; 
    return map; 
} 

Wracając HashMap jest chyba najprostszy i najlepszy sposób, aby uzyskać json ty wymagać:

{"result":true} 
+0

Problem polega na tym, że są rzeczy, które oczekują poprawnego JSON. Na przykład narzędzie Flex Builder, które hermetyzuje wywołania REST API w programie Flex, oczekuje, że wyniki znajdą się w JSON. – Oxmane

+0

przyklejają dane do niestandardowego obiektu opakowania lub hasmapy – NimChimpsky

4

mam znaleźć wygodny w użyciu

public class ObjWrapper<T> implements Serializable { 

    private T obj; 

    public ObjWrapper(T obj) { 
    this.obj = obj; 
    } 

    public T getObj() { 
    return obj; 
    } 

} 

następnie w kontrolerze:

@RequestMapping("/getString") @ResponseBody 
public ObjWrapper<String> getString() { ... 

oraz na kliencie (jQuery)

$.getJson("getString", {}, function (data) { 
      alert(data.obj); 
      }) 

samo z list:

public class ListWrapper<T> implements Serializable { 

    private List<T> content; 

    public ListWrapper(T... objects) { 
    content = Arrays.asList(objects); 
    } 

    public ListWrapper(List<T> content) { 
    this.content = content; 
    } 

    public List<T> getContent() { 
    return content; 
    } 

} 
Powiązane problemy