Я работаю над функцией, которая в зависимости от условия маскировала данные в JSON. У меня есть класс ProtectedResource, в котором есть данные. Я могу обернуть любой класс как защищенный ресурс и с помощью метаданных замаскировать эти поля, если защищенный флаг истинен. **). Ниже мой ProtectedResourceSerializer
public class ProtectedResourceSerializer extends StdSerializer<ProtectedResource> {
public SecuredResourceSerializer() {
this(null);
}
@Override
public void serialize(ProtectedResource securedResource, JsonGenerator jgen, SerializerProvider provider) {
jgen.writeStartObject();
jgen.writeBooleanField(Constants.SECURED_FLAG,securedResource.isSecured());
JavaType javaType = provider.getTypeFactory().constructType(securedResource.getData().getClass());
BeanDescription beanDescription = provider.getConfig().introspect(javaType);
List<BeanPropertyDefinition> properties = beanDescription.findProperties();
Object value = securedResource.getData();
for(BeanPropertyDefinition beanPropertyDefinition : properties){
if (securedResource.isSecured()) {
MaskingMetadata.IncludeType includeType = securedResource.getMaskingMetadata().getIncludeType();
if((includeType.equals(MaskingMetadata.IncludeType.INCLUSION) && securedResource.getMaskingMetadata().getFields().contains(beanPropertyDefinition.getName())) ||
(includeType.equals(MaskingMetadata.IncludeType.EXCLUSION) && !securedResource.getMaskingMetadata().getFields().contains(beanPropertyDefinition.getName()))) {
jgen.writeStringField(beanPropertyDefinition.getName(), Constants.MASKED);
continue;
}
}
provider.defaultSerializeField(beanPropertyDefinition.getName(), beanPropertyDefinition.getGetter().callOn(value), jgen);
}
jgen.writeEndObject();
}
}
Это отлично работает для моего обычного класса.
@Data
public static class My{
private String id;
@JsonIgnore
private String t;
private boolean hasNotes;
@JsonSerialize(using = Str.class)
private A val = new A();
}
Но если я создаю защищенный ресурс из другого вложенного класса, который использует аннотацию JsonSerialize, метод сериализации по умолчанию не использует аннотации JSON, определенные в поле, например, @ JsonSerialize
public static void main(String[] args) throws JsonProcessingException {
//
My a = new An();
a.setId("abc");
a.setT("vv");
SecuredResource<My> m = new SecuredResource<My>(false,a,new MaskingMetadata(Collections.emptySet(), MaskingMetadata.IncludeType.INCLUSION));
ObjectMapper o = new ObjectMapper();
System.out.println(o.writeValueAsString(m));
System.out.println(o.writeValueAsString(a));
}
Для поля val
класса My
, как я могу использовать сериализацию, определенную аннотациями, которая является Str.class?