Проблема с ObjectMapper изменить имя моего поля - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь создать метод, которому передается объект, и читает все поля, чтобы поля, которые имеют значение null и имеют строковые значения, получили значение "".

Проблема теперь возникает с моим классом. У меня есть эта модель:

@Getter
@Setter
@NoArgsConstructor
@ToString
public class AccountModel {

    private String noTotCount;
    private int nTotal;
    private String account;

}

И я сделал этот метод: private ObjectMapper obMapper = new ObjectMapper ();

private Object stringNullToEmpty(Object object) {

    Class<?> clase = object.getClass();
    Map<String, Object> objectMap = obMapper.convertValue(object, new TypeReference<Map<String, Object>>(){});

    for (Field field : clase.getDeclaredFields()) {
        String fieldName = field.getName();
        if(field.getType().equals(String.class) && objectMap.get(fieldName) == null) {
            objectMap.put(field.getName(), "a");

        }
    }

    return obMapper.convertValue(objectMap, clase);

}

Ошибка представляется мне, когда я делаю obMapper.convertValue() потому что он конвертирует мое поле noTotCount в nototCount, поэтому, когда вы go переводите в условное выражение и пытаетесь put(), в объектной карте нет поля, содержащего ключ noTotCount, поскольку ключ, содержащий объектная карта nototCount.

Почему ObjectMapper преобразовывает мое поле noTotCount в nototCount?

1 Ответ

1 голос
/ 16 марта 2020

Вы столкнулись с проблемой в соглашении об именах java, именах геттеров, генерируемых lombok и jackson, когда у вас есть свойства camelcase с одной буквой в качестве первого "слова". См. этот вопрос для получения более подробной информации.

Таким образом, Джексон ожидает, что свойство (методы получения и установки) будет сгенерировано IDE (например, eclipse): getnTotCount, однако я предполагаю этот ломбок генерирует getNTotCount (я не де-ломбировал ваш код). Это приводит к сбою Джексона (воспроизводится путем переименования геттера).

Обходной путь: Создайте геттер самостоятельно и предотвратите его генерацию ломбоком @JsonProperty("nTotCount") public String getNTotCount() или public String getnTotCount()

...