Я использую Джексона для сериализации POJO в JSON перед сохранением их в базу данных. В целях безопасности мне необходимо зашифровать свойства, помеченные аннотацией @ Confidential. Поля (свойства), которые необходимо зашифровать не обязательно должны быть полями верхнего уровня и могут быть глубоко вложенными.
Например, рассмотрим следующие POJO. homeAddress и age человека должны быть зашифрованы (они не являются полями верхнего уровня класса Neighbourhood).
@Serializable
private class Neighborhood {
private String name;
private Collection<Person> people;
}
@Serializable
public class Person {
private String name;
@Confidential
private int age;
@Confidential
private Address homeAddress;
}
@Serializable
public class Address {
private String streetAddress;
private String city;
private String state;
private int zip;
}
Я думаю онаписание процессора аннотаций, который создает реестр полей.Реестр будет создан с использованием отражения и будет проходить все классы, помеченные аннотацией @Serializable.В реестре будет информация о том, какие поля должны быть зашифрованы, а какие нет.
Теперь, после того, как POJO Neighborhood будет сериализован в JSON, я смогу перейти к JSON и найти поля вполевой реестр и делай необходимое.Тем не менее, я не знаю, что делать, если свойства являются коллекциями (то есть списками и картами) и информация общего типа теряется.
Вопросы:
Есть ли лучший и более простой подход, чем тот, который я описал?Если да, что это за подход?
Если нет лучшего подхода, как мне обрабатывать коллекции (списки и карты).
Этот вопрос не совпадает с Настроить Jackson ObjectMapper для чтения пользовательских полей аннотации и маски с комментариями
Вот причины, по которым:
- Мы не знаем, какиеклассы и поля будут помечены аннотацией @Confidential.Так что не уверен, как я могу сгенерировать все необходимые пользовательские сериализаторы на лету и зарегистрировать их с помощью SerializationModule в ObjectMapper Джексона.
- Сгенерированный сериализатор должен знать, как обрабатывать как зашифрованные, так и незашифрованные поля.
- Не уверен, как я буду вводить клиент шифрования в сериализатор.