2013-09-25 56 views
3

在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

我认为这是相同的问题:http://stackoverflow.com/questions/7557397/jackson-json-java-class-fields-are-serialized-multiple-times,甚至这个:http:// stackoverflow .com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferred-worldwide – Katona

回答

6

Jackson's ObjectMapper使用Java bean模式。换句话说,它预计以下

public class Foo { 
    public Object bar; 

    public Object getBar() {...} 

    public void setBar(Object bar) {...} 
} 

getter和setter开始getset,分别,接着用其首字母相应的字段名称大写。如果你改变你的代码

public class MyEntity { 
    @JsonProperty("MYSpecialSuperId") 
    private String mySpecialSuperId; 

    ... 

    public String getMySpecialSuperId() { 
     return this.mySpecialSuperId; 
    } 

} 

注意,场小写my而不是大写(无论@JsonProperty值)开始,我在getMYSpecialSsuperId去除多余的s和使用小写y。所以现在字段名称与getter名称相匹配,jackson知道该属性是相同的,不需要序列化两次。

如果你没有选择,你可以遵循什么Katona posted in the comments和使用

@JsonAutoDetect(getterVisibility=Visibility.NONE) 

使杰克逊完全忽略getter和只使用领域的序列化JSON的。

+0

嗯,我没有选择更改属性名称(但我正在处理此问题;))。因此,一些属性被命名为: ABCDOneOfMyProperty(我讨厌它,但我必须忍受它)。 @JsonAutoDetect(getterVisibility = Visibility.NONE)注解做了诀窍。谢谢。 :)) –

1

我认为你的访问者有一个错字;如果它有“SsuperId”它不匹配字段的名称;因为这样的领域和吸气剂被认为是不同的逻辑性质。

+0

仅凭这一点就无法解决整体问题。 –

+0

问题是由于从getter提取的名称,字段名称之间的不匹配:我猜这是由于非标准命名(多个大写字母作为前缀)。您可能需要为getter重复'@ JsonProperty'注释。 – StaxMan

+0

对不起。我的手指应该归咎于这个错字。 ;) 在真正的代码中,我没有这个错字......只有在这里问这个问题。 –