Невозможно сопоставить 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 подхода, чтобы исправить это:
- для быстрого исправления:
ObjectMapper mapper = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
- для лучшего решения вашей проблемы: используйте лучшее имя для ваших свойств.