Я ищу возможность сериализацию переходной информации только в некоторых случаях:джексон: игнорировать добытчик, но не с @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);
}
}
Если я позвоню getUserAsJson я ожидал увидеть идентификационный код, электронные и другие области, но не детали. Это прекрасно работает. Но я вижу то же самое для getUserAsJsonForAdmin, также без деталей. Если я удалю аннотацию @JsonIgnore - я вижу подробности в обоих вызовах.
Что я не так, и есть ли хороший способ? Благодаря!
Спасибо за хороший пример! –
Хорошо, после тестирования различных решений, настраиваемый фильтр и FilterIntrospector, похоже, так я и хочу. –
Для всех, кто использует этот код в потоках, существует потенциальная проблема параллелизма с использованием shouldIncludeAllFields. Но легко фиксируется просто созданием 2 ObjectMappers, 1 с фильтром и 1 без. ObjectMappers - Threadsafe – muttonUp