Java 实体属性序列化两次

Java 实体属性序列化两次,java,json,spring,jackson,Java,Json,Spring,Jackson,在Spring3.3中,我有一个映射到数据库表的实体。在这个实体类中,我用@JsonProperty注释了所有属性,例如@JsonProperty(“ID”)。 进入控制器时,通过使用DAO/存储库调用服务来获取这样的实体。这很有效,但当我使用@ResponseBody将该实体发送回请求者时,所有属性都会发送两次。按要求一次,但再一次以小写字母开头,直到出现第一个驼峰大小写字母。 一个例子 public class MyEntity { @JsonProperty("MYSpecialS

在Spring3.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属性以大写字母开头,即使它有不止一个大写字母;如果有“sPerID”,则与字段名称不匹配;因此,字段和getter表示不同的逻辑属性。

Jackson的
ObjectMapper
使用javabean模式。换言之,它期望以下几点

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
值如何),我在
getmyspecialssperid
中删除了额外的
s
,并使用了小写字母
y
。因此,现在字段名与getter名匹配,jackson知道属性是相同的,不需要序列化两次

如果你别无选择,你可以按照什么来使用它


让jackson完全忽略getter,只使用字段来序列化JSON。

我认为这是同一个问题:,或者甚至是这样:这本身并不能解决整个问题。问题是从getter提取的名称与字段名称不匹配:我猜这是由于非标准命名(多个大写字母作为前缀)。您可能需要为getter重复
@JsonProperty
注释。很抱歉,我的手指应该为这个输入错误负责。;)在真实代码中,我没有这个输入错误。。。只有在这里问这个问题,我理解。所以打字错误不是原因。但我要说的是,不管怎样,名称都是不匹配的wrt大小写字段名和“损坏的”getter名称之间的差异,因为名称开头有多个大写字母——不幸的是(甚至可能是Jackson的名称损坏,wrt Bean规范中的缺陷?),但这就是问题所在。嗯,我没有更改属性名称的选项(但我正在处理这个;))。因此,有些属性的名称如下:ABCDOneOfMyProperty(我讨厌它,但我不得不接受它)。@jsonautodect(getterVisibility=Visibility.NONE)注释起到了作用。谢谢。:)
@JsonAutoDetect(getterVisibility=Visibility.NONE)