Аннотации по умолчанию игнорируются в настраиваемом сериализаторе Jackson - PullRequest
0 голосов
/ 21 июня 2020

Я работаю над функцией, которая в зависимости от условия маскировала данные в 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...