W previous similar question, zapytałem o, jak serializować dwa różne zestawy pól przy użyciu JacksonJson i Spring.Wiosna i JacksonJson, szeregowanie różnych pól z widokami
Moje przypadek użycia jest typowym mapowanie kontrolerów z @ResponseBody
adnotacja powrocie bezpośrednio konkretnego obiektu lub kolekcji obiektów, które następnie są renderowane z JacksonJson gdy klient dodaje application/json
w nagłówku Accept
.
Miałem dwie odpowiedzi, pierwsza sugeruje zwrócić różne interfejsy z inną listą pobierającą, druga sugeruje użycie widoków Json.
Nie mam problemów, aby zrozumieć pierwszy sposób, jednak na drugi, po przeczytaniu dokumentacji na JacksonJsonViews
, nie wiem, jak wdrożyć go ze Spring.
Aby pozostać na przykładzie, chciałbym zadeklarować trzy klasy pośredniczące, wewnątrz klasy Wyświetleń:
// View definitions:
public class Views {
public static class Public { }
public static class ExtendedPublic extends PublicView { }
public static class Internal extends ExtendedPublicView { }
}
Wtedy mam zadeklarować klas podano:
public class PublicView { }
public class ExtendedPublicView { }
Dlaczego oni na ziemi zadeklaruj puste klasy statyczne i zewnętrzne puste klasy, nie wiem. Rozumiem, że potrzebują "etykiety", ale wystarczy statycznych członków Widoku. I nie jest tak, że ExtendedPublic
rozciąga się na Public
, ponieważ byłoby to logiczne, ale w rzeczywistości są zupełnie niezwiązane.
I wreszcie fasola będzie podać z dopiskiem pogląd lub listę widoków:
//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";
}
Wreszcie w kontrolerze Wiosna, mam myśleć jak zmienić oryginalne odwzorowanie mojego testu fasoli:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() {
return new Bean();
}
mówi zadzwonić:
//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
Więc mam ObjectMapper
instancja wychodząca znikąd i out
, która nie jest serwletem typowym PrintWriter out = response.getWriter();
, ale jest instancją JsonGenerator
i której nie można uzyskać za pomocą nowego operatora. Więc nie wiem, jak zmodyfikować metodę, tutaj jest niepełny try:
@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?
}
więc chciałbym wiedzieć, czy ktoś miał powodzenia przy użyciu JsonView
z wiosną i jak on/ona. Cała koncepcja wydaje się interesująca, ale brakuje dokumentacji i brakuje przykładowego kodu.
Jeśli nie jest to możliwe, użyję tylko interfejsów rozszerzających się nawzajem. Przepraszam za długie pytanie.
Dlaczego próbujesz samodzielnie wykonać JSON? HttpMessageConverter, które są skonfigurowane do używania Jacksona, powinien przekonwertować go automatycznie. – chrislovecnm
@chrislovecnm, w moim prostym przykładzie, po prostu zwracam obiekt lub kolekcję z adnotacją ResponseBody, a Spring robi wszystko "za kulisami". I tu jest problem, ponieważ robi to "potajemnie", nie wiem jak przekazać mu parametry (w moim przypadku Views.Public.class), aby zmienić jego zachowanie. – stivlo