我在我的项目中使用Spring boot Jackson依赖项和lombok,并且由于下划线,我得到重复的字段
这是我的模型课:
@Getter
@Setter
@Accessors(chain = true)
@NoArgsConstructor
@ToString
public class TcinDpciMapDTO {
@JsonProperty(value = "tcin")
private String tcin;
@JsonProperty(value = "dpci")
private String dpci;
@JsonProperty(value = "is_primary_tcin_in_dpci_relation")
private boolean is_primaryTcin = true;
}
如果我在is_primaryTcin
字段中使用下划线,那么我将获得以下重复字段的响应
{
"_primaryTcin": true,
"tcin": "12345",
"dpci": "12345",
"is_primary_tcin_in_dpci_relation": true
}
如果我从字段isprimaryTcin
中删除下划线,那么我将获得正确的答复
{
"tcin": "12345",
"dpci": "12345",
"is_primary_tcin_in_dpci_relation": true
}
这是因为有下划线吗?但是下划线更喜欢在变量名中使用对吗?
答案 0 :(得分:4)
这是您的班级拆解后的样子:
public class TcinDpciMapDTO {
@JsonProperty("tcin")
private String tcin;
@JsonProperty("dpci")
private String dpci;
@JsonProperty("is_primary_tcin_in_dpci_relation")
private boolean is_primaryTcin = true;
public String getTcin() {
return this.tcin;
}
public String getDpci() {
return this.dpci;
}
public boolean is_primaryTcin() {
return this.is_primaryTcin;
}
public TcinDpciMapDTO setTcin(String tcin) {
this.tcin = tcin;
return this;
}
public TcinDpciMapDTO setDpci(String dpci) {
this.dpci = dpci;
return this;
}
public TcinDpciMapDTO set_primaryTcin(boolean is_primaryTcin) {
this.is_primaryTcin = is_primaryTcin;
return this;
}
public TcinDpciMapDTO() {
}
public String toString() {
return "TcinDpciMapDTO(tcin=" + this.getTcin() + ", dpci=" + this.getDpci() + ", is_primaryTcin=" + this.is_primaryTcin() + ")";
}
}
如果未指定生成的属性名,则杰克逊通过使用getter去除getter中的前缀is
或get
来生成它,如果不使用getter来序列化字段,则使用Java字段名来生成它。默认情况下,Jackson仅在序列化过程中使用吸气剂。因为您将@JsonProperty
放在了字段上,所以Jackson会同时使用字段和getter并检查字段是否已经通过匹配生成的属性名进行序列化(无论如何,这都是我的猜测),它无法识别从字段{{ 1}}和从getter is_primaryTcin
生成的属性相同(一个内部命名为is_primaryTcin()
,另一个is_primaryTcin
)-请注意,如果将_primaryTcin
重命名为{{1 }}问题消失了。
答案 1 :(得分:2)
当您使用is_primaryTcin
而不使用下划线时,则同时使用了两者。
您可以使用PropertyNamingStrategy
对其进行修复。
如果愿意
...
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class TcinDpciMapDTO {
private String tcin;
private String dpci;
private boolean isPrimaryTcinInDpciRelation = true;
}
JSON输出为
{
"tcin": "12345",
"dpci": "12345",
"is_primary_tcin_in_dpci_relation": true
}