Как условно игнорировать свойства с помощью Jackson AnnotationIntrospector

3

Я хочу создать аннотацию, чтобы Джексон игнорировал аннотированные поля, если не установлен определенный уровень трассировки:

public class A {
    @IgnoreLevel("Debug") String str1;
    @IgnoreLevel("Info") String str2;
}

Или, если это легче реализовать, у меня также могут быть отдельные аннотации для разных уровней:

public class A {
    @Debug String str1;
    @Info String str2;
}

В зависимости от конфигурации ObjectMapper, либо

  • все поля "Debug" и "Info" должны игнорироваться при сериализации и десериализации, или
  • все поля "Debug" должны игнорироваться, или
  • все поля должны быть сериализованы/десериализованы.

Я полагаю, что это должно быть возможно с пользовательским AnnotationIntrospector. У меня есть этот пост, но он не показывает пример того, как реализовать пользовательский AnnotationIntrospector.

Теги:
jackson
annotations
annotation-introspector

1 ответ

4

Если вы хотите подклассом JacksonAnnotationIntrospector, вам просто нужно переопределить hasIgnoreMarker, что-то вроде:

@Override
public boolean hasIgnoreMarker(AnnotatedMember m) {
  IgnoreLevel lvl = m.findAnnotation(IgnoreLevel.class);
  // use whatever logic necessary
  if (level.value().equals("Debug")) return true;
  return super.hasIgnoreMarker();
}

но обратите внимание, что интроспекция аннотаций происходит только один раз для каждого класса, поэтому вы не можете динамически изменять критерии, которые вы используете.

Для более динамической фильтрации вы можете скорее использовать функциональность JSON Filter, см., например: http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню