Я пытаюсь применить пользовательский сериализатор к списку, который содержит список объектов с аннотацией. Я хотел бы удалить это свойство, если пользователю не предоставлено (роль не такая, как user ). Это работает хорошо, когда свойство не является списком (https://www.baeldung.com/jackson-serialize-field-custom-criteria)
** ОБНОВЛЕНИЕ **
public class Catalog {
private List<Customer> customers;
private List<Order> orders;
// getter & setter
}
@Role(name = "user")
public class Customer extends Hidden {
private String name;
// getter & setter
}
@Role(name = "admin")
public class Order extends Hidden {
private int id;
// getter & setter
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Hidden implements Hidable {
@Schema(hidden = true )
@JsonIgnore
protected boolean hidden;
@Override
public boolean isHidden() {
return hidden;
}
public void setHidden(final boolean hidden) {
this.hidden = hidden;
}
}
Мой первый подход состоял в регистрации нового модуля для маппера
@Override
public JsonSerializer<?> modifyCollectionSerializer(SerializationConfig config,
CollectionType valueType, BeanDescription beanDesc, JsonSerializer<?> serializer) {
System.out.println("modifySerializer "+beanDesc.getBeanClass().getName());
// create new serializer depand on type Order
// If list contains Order then return new OrderSerializer((JsonSerializer<Object>) serializer);
// If list contains Customerthen return new CustomerSerializer((JsonSerializer<Object>) serializer);
// default
return new CollectionSerializer((JsonSerializer<Object>) serializer);
}
И мой пользовательский сериализатор
public class CollectionSerializer extends JsonSerializer<List<? extends Hidden>> {
private JsonSerializer<Object> defaultSerializer;
public CollectionSerializer(final JsonSerializer<Object> serializer) {
defaultSerializer = serializer;
}
@Override
public void serialize(List<? extends Hidden> value, JsonGenerator jgen,
SerializerProvider provider) throws IOException {
System.out.println("HealthSerializer");
if (value.get(0).isHidden())
return;
defaultSerializer.serialize(value, jgen, provider);
}
@Override
public boolean isEmpty(final SerializerProvider provider, final List<? extends Hidden> value) {
return (value == null || value.get(0).isHidden());
}
}
Но я не могу достать объект, содержащийся в списке. Я хотел бы определить сериализатор, определяющий c для типа объекта, содержащегося в списке, потому что аннотированная роль в классе различна.
Не могли бы вы мне помочь?
Спасибо