szukam możliwości serializacji przemijające informacje tylko w niektórych przypadkach:Jackson: ignorować getter, ale nie z @JsonView
@JsonInclude(Include.NON_NULL)
@Entity
public class User {
public static interface AdminView {}
... id, email and others ...
@Transient
private transient Details details;
@JsonIgnore // Goal: ignore all the time, except next line
@JsonView(AdminView.class) // Goal: don't ignore in AdminView
public Details getDetails() {
if (details == null) {
details = ... compute Details ...
}
return details;
}
}
public class UserDetailsAction {
private static final ObjectWriter writer = new ObjectMapper();
private static final ObjectWriter writerAdmin = writer
.writerWithView(User.AdminView.class);
public String getUserAsJson(User user) {
return writer.writeValueAsString(user);
}
public String getUserAsJsonForAdmin(User user) {
return writerAdmin.writeValueAsString(user);
}
}
Jeśli zadzwonię getUserAsJson Spodziewałem się zobaczyć id, poczty elektronicznej i innych dziedzinach, ale nie szczegóły. To działa dobrze. Ale widzę to samo dla getUserAsJsonForAdmin, również bez szczegółów. Jeśli usunę adnotację @JsonIgnore - widzę szczegóły w obu połączeniach.
Co jest nie tak i czy istnieje dobry sposób na odejście? Dzięki!
Dziękuję za dobry przykład! –
OK, po przetestowaniu różnych rozwiązań, niestandardowy filtr i FilterIntrospector wydaje się być sposobem, w jaki chcę pójść. –
Dla każdego, kto używa tego kodu w wątkach, istnieje potencjalny problem z współbieżnością przy użyciu opcji shouldIncludeAllFields. Ale łatwo naprawić, tworząc tylko 2 ObjectMappers, 1 z filtrem i 1 bez. ObjectMappers to Threadsafe – muttonUp