在Spring 3.3中,我有一个映射到数据库表的实体。在这个实体类中,我有使用@JsonProperty注释的所有属性,例如@JsonProperty(“ID”)。 进入控制器,调用服务以通过使用DAO /存储库来获取此类实体。这很好用但是当我使用@ResponseBody将此实体发送回请求者时,所有属性都会被发送两次。一旦要求,但再一次开始小写直到第一个驼峰案件出现。 一个例子......
public class MyEntity {
@JsonProperty("MYSpecialSuperId")
private String MYSpecialSuperId;
...
public String getMYSpecialSsuperId() {
return this.MYSpecialSuperId;
}
}
JSON字符串化结果后:
{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" }
为什么结果中的属性两次,为什么字体不同?
顺便说一句: 我的想法是让Java属性以大写字母开头,即使有一个以上的大写字母。
答案 0 :(得分:8)
杰克逊的ObjectMapper
使用Java bean模式。换句话说,它需要以下
public class Foo {
public Object bar;
public Object getBar() {...}
public void setBar(Object bar) {...}
}
getter和setter分别以get
和set
开头,后跟相应的字段名称,首字母大写。如果您将代码更改为
public class MyEntity {
@JsonProperty("MYSpecialSuperId")
private String mySpecialSuperId;
...
public String getMySpecialSuperId() {
return this.mySpecialSuperId;
}
}
请注意,该字段以小写my
而不是大写字母开头(无论@JsonProperty
值如何),我删除了s
中的额外getMYSpecialSsuperId
并使用了小写字母{ {1}}。所以现在字段名称与getter名称匹配,jackson知道属性是相同的,不需要序列化两次。
如果您别无选择,可以按照Katona posted in the comments进行操作并使用
y
让jackson完全忽略getter,只使用字段来序列化你的JSON。
答案 1 :(得分:1)
我认为你的访问者中有一个拼写错误;如果它有" SsuperId"它与该字段的名称不匹配;因此,字段和getter意味着不同的逻辑属性。