In un previous similar question, ho chiesto informazioni su come serializzare due diversi set di campi utilizzando JacksonJson e Spring.Spring e JacksonJson, serializzando diversi campi con viste
mio caso d'uso è la mappatura tipica Regolatore con @ResponseBody
annotazione tornare direttamente un oggetto o raccolte di oggetti, che vengono poi resi con JacksonJson ogni volta che il client aggiunge application/json
nell'intestazione Accept
particolare.
Ho avuto due risposte, la prima suggerisce di restituire interfacce diverse con una lista getter diversa, la seconda suggerisce di utilizzare Json Views.
Non ho problemi a capire il primo modo, tuttavia, per il secondo, dopo aver letto la documentazione su JacksonJsonViews
, non so come implementarlo con Spring.
Per rimanere con l'esempio, vorrei dichiarare tre classi stub, all'interno della classe Visualizzazioni:
// View definitions:
public class Views {
public static class Public { }
public static class ExtendedPublic extends PublicView { }
public static class Internal extends ExtendedPublicView { }
}
Poi ho dichiarare le classi menzionate:
public class PublicView { }
public class ExtendedPublicView { }
Perché sulla terra hanno dichiarare classi statiche vuote e classi vuote esterne, non lo so. Capisco che hanno bisogno di una "etichetta", ma i membri statici di Views sarebbero sufficienti. E non è che ExtendedPublic
si estenda Public
, come sarebbe logico, ma in realtà sono del tutto estranei.
E infine il fagiolo specificherà con annotazione la vista o l'elenco di visite:
//changed other classes to String for simplicity and fixed typo
//in classname, the values are hardcoded, just for testing
public class Bean {
// Name is public
@JsonView(Views.Public.class)
String name = "just testing";
// Address semi-public
@JsonView(Views.ExtendedPublic.class)
String address = "address";
// SSN only for internal usage
@JsonView(Views.Internal.class)
String ssn = "32342342";
}
Infine nel controller primavera, ho a pensare come cambiare la mappatura originale della mia fagiolo di prova:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() {
return new Bean();
}
dice chiamare:
//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
Così ho un ObjectMapper
istanza proveniente dal nulla e un out
che non è il tipico servlet PrintWriter out = response.getWriter();
, ma è un'istanza di JsonGenerator
e che non può essere ottenuto con il nuovo operatore. Quindi non so come modificare il metodo, qui è una prova incompleta:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator out; //how to create?
objectMapper.viewWriter(Views.Public.class).writeValue(out, new Bean());
return ??; //what should I return?
}
quindi vorrei sapere se qualcuno ha avuto successo con JsonView
con la primavera e come lui/lei ha fatto. L'intero concetto sembra interessante, ma la documentazione sembra carente, manca anche il codice di esempio.
Se non è possibile, userò solo le interfacce che si estendono l'un l'altra. Ci scusiamo per la lunga domanda.
Perché stai provando a fare il JSON da solo? HttpMessageConverter che è configurato per utilizzare Jackson dovrebbe convertirlo automaticamente. – chrislovecnm
@chrislovecnm, nel mio semplice esempio, restituisco semplicemente l'annotazione Object o Collection con ResponseBody e Spring fa tutto "dietro le quinte". Ed ecco il problema, dal momento che lo fa "segretamente", non so come passare parametri (nel mio caso Views.Public.class) per cambiarne il comportamento. – stivlo