【发布时间】:2021-05-27 10:44:30
【问题描述】:
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"])
请求:空
现在,当我将我的测试类更新为:
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 填充物1, ccd=CCMTCCD(time=dTime(dTime=4:35), x=34567), uPwName=null)
那么 jackson 是如何在这里与 lombok 合作的,属性“dType”和“uPwName”是否存在问题?
【问题讨论】:
-
这里使用Lombok重要吗?我会简单地跳过 Lombok 并使四个数据类具有公共字段,例如
public class dTime { public String dTime; } -
@Erik,是的,使用 lombok 很重要,因为请求有大约 200 个属性,我无法公开字段
-
嗯,我不是 Lombok 方面的专家,但在我看来,Lombok 和 Jackson 似乎不同意应该调用
dType的二传手。从您的错误消息来看,杰克逊似乎认为您的班级有一个属性dtype(而不是dType) -
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);可能会有所帮助...
标签: java jackson lombok jackson-databind sts