2012-10-16 7 views
7

J'ai un code d'une API REST qui utilise @ResponseBody pour renvoyer le résultat, et un MappingJacksonHttpMessageConverter pour le renvoyer au format JSON.Spring @ResponseBody produit un JSON invalide pour les types primitifs

Tout fonctionne bien pour les objets complexes. Pour les primitives comme int, boolean et string Je reçois un JSON qui ne commence pas par {ou [. Ce JSON n'est pas valide.

Je me demandais quelle est la bonne façon de retourner un simple type comme ça? Devrais-je l'encapsuler dans un objet tel que { Result : true }?

Merci

Exemple de code:

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

Cela juste retour true ou false qui est un JSON non valide. Il devrait soit être encapsulé dans un objet ou un tableau (si je comprends bien).

Répondre

8

Il retourne juste vrai, ou faux. Et vous avez raison, ce n'est pas JSON.

Il ne peut pas être json car ce n'est pas un objet, c'est simplement une primitive, donc c'est bien tel quel - il sera assigné à une variable javascript dans votre successeur.

Si vous retournez une liste de booléens vous obtenez un tableau:

[true,false,true] 

Si vous devez avoir JSON complètement formé ne renvoient pas l'utilisation d'un objet primitif d'emballage hashmap ou personnalisé.

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

De retour HashMap est probablement la plus simple et la meilleure façon d'obtenir le JSON dont vous avez besoin:

{"result":true} 
+0

Le problème est qu'il ya des choses qui attendent un JSON correct. Par exemple, l'outil Flex Builder qui encapsule les appels d'API REST dans Flex s'attend à ce que les résultats soient en JSON. – Oxmane

+0

coller les données dans un objet wrapper personnalisé ou un hashmap – NimChimpsky

4

J'ai trouvé facile à utiliser

public class ObjWrapper<T> implements Serializable { 

    private T obj; 

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

    public T getObj() { 
    return obj; 
    } 

} 

puis dans le contrôleur:

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

et sur le client (jquery)

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

même avec des listes:

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; 
    } 

} 
Questions connexes