Я написал пользовательский сериализатор и пользовательский десериализатор для сериализации свойств, помеченных аннотацией @Confidential.
@Data
public class Person {
private String name;
@Confidential
private String address;
}
Пользовательский сериализатор сериализует POJO со следующими значениями:
{ "name": "John Doe", "address": "Kearney St"}
следующим образом:
{"name":"John Doe", "address": {"value":"IjIwMzEwIDU4dGggTG4gTkUi"}}
Пользовательский десериализатор также может десериализовать JSON до штрафа Person POJO.
Однако, когда я делаю поля в Персональном POJO окончательными , сериализация продолжает работать, , но десериализация не удается.
@Data
public class Person {
private final String name;
@Confidential
private final String address;
}
Вот реализация BeanSerializerModifier:
@AllArgsConstructor
public class CustomDeserializerModifier extends BeanDeserializerModifier {
private final ObjectMapper objectMapper;
@Override
public BeanDeserializerBuilder updateBuilder(final DeserializationConfig config,
final BeanDescription beanDesc,
final BeanDeserializerBuilder builder) {
Iterator<SettableBeanProperty> beanPropertyIterator = builder.getProperties();
beanPropertyIterator.forEachRemaining(settableBeanProperty -> {
final Confidential annotation = settableBeanProperty.getAnnotation(Confidential.class);
if (encryptedProperty != null) {
JsonDeserializer<Object> current = settableBeanProperty.getValueDeserializer();
final SettableBeanProperty newSettableBeanProperty =
settableBeanProperty.withValueDeserializer(
new CustomDeserializer(annotation, current, objectMapper)
);
builder.addOrReplaceProperty(newSettableBeanProperty, true);
}
});
return builder;
}
}
Я обнаружил, что CustomDeserializer никогда не вызывается, когда поля Person POJO являются окончательными.
Вот сообщение об ошибке:
com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: {"name":"John Doe","address":{"value":"IjIwMzEwIDU4dGggTG4gTkUi"}}; line: 1, column: 30] (through reference chain: com.custom.model.Person["address"])
Может ли эксперт Джексона скажите мне, почему мой CustomDeserializer не вызывается, когда поля POJO являются окончательными.
Спасибо!