2012-10-16 7 views
7

Ho un codice da un'API REST che utilizza @ResponseBody per restituire il risultato e un MappingJacksonHttpMessageConverter per restituirlo in un formato JSON.Spring @ResponseBody produce un JSON non valido per i tipi primitivi

Funziona tutto bene per oggetti complessi. Per primitive come int, boolean e string Ottengo un JSON che non inizia con {o [. Questo non è un JSON valido.

Mi chiedevo qual è il modo corretto per restituire solo un tipo semplice come quello? Devo incapsularlo in un oggetto come { Result : true }?

Grazie

codice di esempio:

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

Ciò restituirà solo true o false che è un JSON valido. Dovrebbe essere incapsulato in un oggetto o in un array (se ho capito bene).

risposta

8

Restituisce solo vero o falso. E tu hai ragione che non è json.

Non può essere json perché non è un oggetto, è semplicemente un primitivo, quindi è bello come è - sarà assegnato a una variabile javascript nel tuo gestore di successo.

Se si restituisce una lista di booleane si ottiene un array:

[true,false,true] 

Se è necessario aver completamente formato JSON non restituiscono un uso primitivo un oggetto wrapper HashMap o personalizzato.

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

Tornando un HashMap è probabilmente il modo più semplice e migliore per ottenere il JSON si richiede:

{"result":true} 
+0

Il problema è che ci sono cose che si aspettano una corretta JSON. Ad esempio lo strumento Flex Builder che incapsula le chiamate API REST in Flex si aspetta che i risultati siano in JSON. – Oxmane

+0

incollare i dati in un oggetto wrapper personalizzato o in una mappa di hash – NimChimpsky

4

ho trovato comodo da usare

public class ObjWrapper<T> implements Serializable { 

    private T obj; 

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

    public T getObj() { 
    return obj; 
    } 

} 

poi nel controllore:

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

e sul client (jquery)

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

stesso con le liste:

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

} 
Problemi correlati