Невозможно сопоставить Json с Java-объектом с помощью Джексона и ломбока

POJO:

      import lombok.Data;
@Data
public class CCMTRequest {
    
    private MOEH cch;
    
    private String filler1;
    
    private CCMTCCD ccd;
    
    private String uPwName;
}


@Data
public class MOEH {
    private String c;
    private int z;
    private String dType;
}


@Data
public class CCMTCCD {
    private dTime time;
    private int x;
}

@Data
public class dTime {
    private String dTime;
}

Тестовый класс:

      public class TestJacksonParser {
    
    @Test
    void load_jsonToPOJO() {
        ObjectMapper mapper = new ObjectMapper();
        ClassLoader load = this.getClass().getClassLoader();
        File file = new File(load.getResource("request.json").getFile());
        CCMTRequest req = null;
        try {
            req = mapper.readValue(file, CCMTRequest.class);
        }
        catch(Exception e) {
            System.out.println(e.getMessage());
        }
        System.out.println("\nRequest: " + req);
    }
    
}

request.json:

      {
    "cch" : {
        "c" : "C",
        "z" : 4678,
        "dType" : "dtype"       
    },
    "filler1" : "random filler1",
    "ccd" : {
        "time" : {
            "dTime" : "4:35"
        },
        "x" : 34567
    },
    "uPwName" : "uPwName"
}

Ошибка:

Нераспознанное поле «dType» (класс com.spring.mapstruct.test.MOEH), не помеченное как игнорируемое (3 известных свойства: «z», «c», «dtype»]) в [Источник: (Файл); строка: 5, столбец: 14] (через цепочку ссылок: com.spring.mapstruct.test.CCMTRequest ["cch"] -> com.spring.mapstruct.test.MOEH ["dType"])

Запрос: null

Теперь, когда я обновляю свой тестовый класс как:

      public class TestJacksonParser {
        
        @Test
        void load_jsonToPOJO() {
            ObjectMapper mapper = new ObjectMapper();
    
            //ignore Unknown JSON Fields
          mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            ClassLoader load = this.getClass().getClassLoader();
            File file = new File(load.getResource("request.json").getFile());
            CCMTRequest req = null;
            try {
                req = mapper.readValue(file, CCMTRequest.class);
            }
            catch(Exception e) {
                System.out.println(e.getMessage());
            }
            System.out.println("\nRequest: " + req);
        }
        
    }

Я получаю вывод как:

Запрос: CCMTRequest (cch = MOEH (c = C, z = 4678, dType = null), filler1 = random filler1, ccd = CCMTCCD (time = dTime (dTime = 4:35), x = 34567), uPwName = null)

Итак, как Джексон здесь работает с ломбоком, есть ли проблема со свойствами «dType» и «uPwName» ?

1 ответ

обо всем по порядку, в следующий раз, пожалуйста, предоставьте лучший пример, а не случайные свойства имени. это сбивает с толку.

ваша проблема в том, что lombok генерирует геттер и сеттер для свойства типа «uPwName» становится «getUPwName()» и «setUPwName ()». Джексон прочитал это как «getuPwName» и «setuPwName»;

библиотека использует разные соглашения об именах для геттеров и сеттеров.

есть 2 подхода, чтобы исправить это:

  1. для быстрого исправления:
      ObjectMapper mapper = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
  1. для лучшего решения вашей проблемы: используйте лучшее имя для ваших свойств.
Другие вопросы по тегам