La risposta è piuttosto semplice quando ci si rende conto che non esiste uno speciale HandlerMethodReturnValueHandler
per la nuova API JSR 353. Invece, in questo caso, lo RequestResponseBodyMethodProcessor
(per @ResponseBody
) utilizza uno MappingJackson2HttpMessageConverter
per serializzare il valore di ritorno del metodo del gestore.
Internamente, lo MappingJackson2HttpMessageConverter
utilizza uno ObjectMapper
. Per impostazione predefinita, lo ObjectMapper
utilizza i getter di una classe per serializzare un oggetto su JSON.
Supponendo che si sta utilizzando Glassfish
s' implementazione del provider della JSR 353, le classi sono org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImpl
, org.glassfish.json.JsonStringImpl
, e org.glassfish.json.JsonNumberImpl
, e javax.json.JsonValue$3
(una classe anonima per il valore FALSE
).
Perché JsonObjectImpl
(il risultato, vale a dire. Radice, oggetto) è una (tipo speciale) Map
, ObjectMapper
serializza le voci della mappa come elementi JSON coppia chiave-valore, dove la chiave mappa è la chiave di JSON, e il valore Mappa è il valore JSON. Per la chiave, funziona perfettamente, serializzando come name
, age
e married
. Per il valore, utilizza le classi che ho menzionato sopra e i rispettivi getter. Ad esempio, org.glassfish.json.JsonStringImpl
è implementato come
final class JsonStringImpl implements JsonString {
private final String value;
public JsonStringImpl(String value) {
this.value = value;
}
@Override
public String getString() {
return value;
}
@Override
public CharSequence getChars() {
return value;
}
@Override
public ValueType getValueType() {
return ValueType.STRING;
}
...
}
ObjectMapper
utilizza quindi i getter Java Bean per serializzare l'oggetto JsonStringImpl
(ovvero il valore di mappa Entry), come
{"chars":"Dade","string":"Dade","valueType":"STRING"}
Lo stesso vale per gli altri campi .
Se si desidera scrivere correttamente il JSON, è sufficiente restituire un String
.
@RequestMapping("/test", produces="application/json")
@ResponseBody
public String test() {
JsonObject result = Json.createObjectBuilder()
.add("name", "Dade")
.add("age", 23)
.add("married", false)
.build();
return result.toString();
}
O fare il vostro proprio HandlerMethodReturnValueHandler
, un po 'più complicato, ma più gratificante.
Che API è questo? –
@SotiriosDelimanolis di API, ti riferisci a JsonObject? è la JSR 353: API Java per l'elaborazione JSON.Domanda aggiornata anche – dade