4

在 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 属性以大写字母开头不是我的想法,即使有多个大写字母也是如此。

4

2 回答 2

9

Jackson'sObjectMapper使用 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的 ingetMYSpecialSsuperId并使用了小写y。所以现在字段名称与 getter 名称匹配,杰克逊知道属性是相同的,不需要序列化两次。

如果您别无选择,您可以按照Katona 在评论中发布的内容并使用

@JsonAutoDetect(getterVisibility=Visibility.NONE)

让杰克逊完全忽略吸气剂,只使用这些字段来序列化您的 JSON。

于 2013-09-26T02:09:25.840 回答
1

我认为您的访问器中有错字;如果它具有“SsuperId”,则它与字段名称不匹配;因此,field 和 getter 被认为是不同的逻辑属性。

于 2013-09-26T01:41:13.103 回答