Настраиваемое поле игнорирования аннотаций из сериализации - PullRequest
0 голосов
/ 24 сентября 2019

Рассмотрим случай, когда у меня есть 2 экземпляра Object Mapper.Я хочу, чтобы из сериализации были исключены поля, аннотированные некоторой пользовательской аннотацией. В то время как другой маппер включает (игнорирует аннотацию)

Подобный класс имеет 3 поля: a, b, c и c помечены некоторой аннотацией (скажем, @IgnoreField) (У них будет номер класса, у каждого будут свои Поля, которые не предназначены для сериализации)

Теперь 1-й объектный преобразователь o1 должен сериализовать только a и b.В то время как 2-й объектный преобразователь o2 может сериализовать a, b и c.

Это может случиться с любым классом, имеющим различные поля, некоторые из которых могут быть аннотированы.

Ответы [ 4 ]

0 голосов
/ 24 сентября 2019

Вы всегда можете реализовать пользовательский JsonSerializer и зарегистрировать его в ObjectMapper.

class Bean {
    @Ignore
    String a;
    String b;
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Ignore {

}

class BeanWithIgnoredFieldsSerializer extends JsonSerializer<Bean> {

    @Override
    public void serialize(final Bean value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeStartObject();
        try {
            for (final Field f : Bean.class.getFields()) {
                if (f.isAnnotationPresent(Ignore.class)) {
                    gen.writeStringField(f.getName(), (String) f.get(value));
                }
            }
        } catch (final Exception e) {
            //
        }
        gen.writeEndObject();
    }

}

class BeanModule extends SimpleModule {

    BeanModule() {
        addSerializer(Bean.class, new BeanWithIgnoredFieldsSerializer());
    }
}

void configure(final ObjectMapper om) {
    om.registerModule(new BeanModule());
}

Примечание. Я не тестировал этот код, но это общая идея, как добавлять пользовательские сериализаторы в OM,Настройте код в методе serialize так, как вы хотите.

0 голосов
/ 24 сентября 2019

Я бы посоветовал вам попробовать пользовательскую аннотацию здесь, используя которую вы можете разместить аннотацию в желаемом поле и можно разместить на любой номер.классов.Таким образом, используя отражение, являющееся ключевым понятием пользовательской аннотации, вы можете определить, что делать с этой аннотацией.Проверьте этот пример:

Пример пользовательской аннотации

0 голосов
/ 24 сентября 2019

Отдельный отказ от ответа:

Скорее всего, это ужасная идея.

Вы пишете код для сообщения вашего намерения .Когда вы используете эту аннотацию, вы говорите «всем», что эти поля следует игнорировать.

Читатель-человек, смотрящий на ваш код, может потратить полдня, задавая себе вопрос: «он говорит @IgnoreField для a и c, так почему, черт возьми, a и c показываютсериализованные данные?

Другими словами, любую проблему, которую вы пытаетесь решить здесь, ответ, скорее всего, , а не , взломав игнорирование аннотаций иногда .

Следующее лучшее «разумное» решение может быть следующим: полагаться на различные пользовательские аннотации, такие как @IgnoreAlways и что-то вроде @OnlyIncludeForXyz.Другими словами: четко выразить, что может произойти.Вместо того, чтобы использовать декларативное программирование, чтобы потом «лгать» о том, что вы объявили.

0 голосов
/ 24 сентября 2019

Попробуйте настроить SimpleBeanPropertyFilter для другого условия.

@JsonFilter("someBeanFilter")
public class SomeBean {
}

SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("someBeanFilter",SimpleBeanPropertyFilter.serializeAllExcept("aFild")); 

ObjectMapper mapper = new ObjectMapper();
mapper.setFilterProvider(filterProvider); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...