为简单起见,这是一个简单的类:
class GetterMethodsObject {
int id = 10;
public int getId() {
return id;
}
// @JsonIgnore
public boolean isId() {
return true;
}
}
序列化此对象应该给出:
{"id":10}
因为有公共getter方法。用法示例:
mapper=new ObjectMapper();
mapper.writeValueAsString(object);
但我得到例外:
com.fasterxml.jackson.databind.JsonMappingException:
Conflicting getter definitions for property "id": org.citi.facility.GetterMethodsObject#isId(0 params) vs org.citi.facility.GetterMethodsObject#getId(0 params)
由于id
为Integer
所以,我希望Jackson
可以调用getId()
方法而不是isId()
。只有当id是boolean时才应该调用isId()
方法?即使我把@JsonIgnore
放在一边也没帮助。我不能改变实际的对象。如何解决这个问题?
答案 0 :(得分:3)
Jackson
库检查用于序列化/反序列化的getter / setters方法。你可以通过下面的脏黑客来省略这个恼人的bug。您必须使用两个注释:
@JsonIgnore
- 告诉Jackson
忽略此属性@JsonProperty("isId")
- 告诉Jackson
在序列化过程中使用此方法名称。看起来Jackson
发现了碰撞,因为它找到了两种方法,这两种方法链接到一个字段 - id
。您的POJO
课程应如下所示:
class GetterMethodsObject {
private int id = 10;
public int getId() {
return id;
}
@JsonIgnore
@JsonProperty("isId")
public boolean isId() {
return true;
}
}
另一种解决方案:您应该重命名isId
方法,因为它令人困惑。您应该考虑:hasId
甚至更好hasValidId
。我不知道您的isId
方法正在做什么,但您应该在方法名称中提供更多信息。