Джексон использует геттеры для десериализации полей - PullRequest
0 голосов
/ 22 марта 2020

У меня настроен Джексон следующим образом.

objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

Таким образом, он сериализует только поля и функции, помеченные @JsonProperty, и это именно то, что я хочу. Однако он использует java.lang.reflect.Field.get(bean) для получения значений полей.

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

Есть ли способ, чтобы сделать это возможным?

Обновление

Я отладил вопрос и нашел

   public void serializeAsField(Object bean, JsonGenerator gen,
            SerializerProvider prov) throws Exception {
        // inlined 'get()'
        final Object value = (_accessorMethod == null) ? _field.get(bean)
                : _accessorMethod.invoke(bean, (Object[]) null);

в BeanPropertyWriter. _accessorMethod равно нулю.

Обновление 2

Это один из классов, которые я хочу сериализовать.

import lombok.Data;

@Data
public class JwtAuthenticationResponse{
    private final String token;
}

Получатель сгенерированный с использованием аннотации @Data от lombok.

Обновление 3

Я отладил дальше и получил POJOPropertiesCollector._removeUnwantedAccessor(props).

Он удаляет ранее нашел аксессор из-за его видимости, который был определен с objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);.

Поскольку я использую lombok, я не могу использовать какие-либо аннотации @ Json*** на геттерах. Вот почему я решил использовать только поля, чтобы определить свойства, которые будут сериализованы. Но я всегда хотел использовать их соответствующие получатели в качестве средства доступа к значениям.

Есть ли способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...