Мне нужно написать метод, который принимает некоторый объект, некоторое имя поля fieldName
, которое существует в классе данного объекта, и некоторое значение поля value
.Значение представляет собой JSON-сериализованную форму поля.Этот метод должен принять значение и соответственно десериализовать его, что-то вроде этого:
static void setField(Object obj, String fieldName, String value) throws Exception {
Field field = obj.getClass().getDeclaredField(fieldName)
Object valObj = objectMapper.readValue(value, field.getType());
field.set(obj, valObj);
}
(на самом деле мне нужно только извлечь десериализованное значение и не устанавливать его снова, но это делает его лучшим примером.)Это работает до тех пор, пока десериализации по умолчанию Джексона достаточно.Теперь давайте предположим, что у меня есть класс с пользовательским (de) сериализатором:
class SomeDTO {
String foo;
@JsonSerialize(using = CustomInstantSerializer.class)
@JsonDeserialize(using = CustomInstantDeserializer.class)
Instant bar;
}
Одним из возможных решений будет ручная проверка на JsonDeserialize
аннотаций.Тем не менее, я действительно не хочу пытаться копировать любые политики, которые Джексон использует, чтобы решить, какой сериализатор использовать, поскольку это кажется хрупким (например, глобально зарегистрированные сериализаторы).
Есть ли хороший способ десериализации значения с использованиемконфигурация десериализации поля, определенная в классе DTO?Может быть, десериализовать значение в тип поля, передавая аннотации поля Джексону, чтобы они удостоились чести?
Мне удалось получить экземпляр AnnotatedMember
, который содержит всю необходимую информацию (JSON-аннотации и отражающее поле (или доступ к установщику / получателю), но не смог понять, как я мог бы использовать его для десериализации отдельного значения из-за отсутствия документации:
final JavaType dtoType = objectMapper.getTypeFactory().constructType(SomeDTO.class);
final BeanDescription description = objectMapper.getDeserializationConfig().introspect(dtoType);
for (BeanPropertyDefinition propDef: beanDescription.findProperties()) {
final AnnotatedMember mutator = propertyDefinition.getNonConstructorMutator();
// now what? Also: How do I filter for the correct property?
}