2013-04-15 114 views
16

我有一个与属性的getter和setter的简单接口。反序列化时忽略属性

public interface HasMoney { 

     Money getMoney(); 

     void setMoney(Money money); 

} 

我有另一个实现这个接口的UserAccount类。

public class UserAccount implements HasMoney { 

     private Money money; 

     @Override 
     Money getMoney() // fill in the blanks 

     @Override 
     void setMoney(Money money) // fill in the blanks 

} 

我的问题是,我想要序列金钱财产,但反序列化它即不从用户此属性接受任何值忽略。我已经在setter和@JsonIgnore(false)上尝试了@JsonIgnore,但它确实忽略了它,但它在序列化时也是如此。

我试着在setter上使用@JsonIgnore和在getter上使用@JsonProperty来明确告诉Jackson我们打算跟踪这个属性,当Money属性被发送到服务器时,似乎会崩溃应用程序,Jackson试图反序列化它抛出MalformedJsonException:不能构造Money类型的对象。

最奇怪的是,在setter上放置@JsonIgnore和在setter上使用@JsonProperty对于大多数情况下的属性是原始的。

回答

10

好吧,@JsonIgnore的行为从1.9开始从根本上改变(对于更糟的IMO)。没有进入的,为什么你的财产没有被反序列化过程中忽略的细节魔鬼,试试这个代码来解决它:

public class UserAccount implements HasMoney { 
    @JsonIgnore 
    private BigDecimal money; 

    // Other variable declarations, constructors 

    @Override 
    @JsonProperty 
    public BigDecimal getMoney() { 
     return money; 
    } 

    @JsonIgnore 
    @Override 
    public void setMoney(final BigDecimal money) { 
     this.money = money; 
    } 

    // Other getters/setters 
} 

注意对类变量使用@JsonIgnore - 其工作方案所需。

注:根据您的环境和使用情况,您可能需要额外的配置你的ObjectMapper实例,例如, USE_GETTERS_AS_SETTERS,AUTO_DETECT_GETTERS,AUTO_DETECT_SETTERS

+1

这实际上是解决方案的一部分。我还必须添加objectMapper.disable(MapperFeature.USE_GETTERS_AS_SETTERS),然后它就起作用了。请编辑你的答案,我会接受它。令人伤心的是,没有更清晰的方法(至少我无法找到它)。 –

+0

@NishantNagwani - 奇怪的,没有启用该功能的作品。我为我的答案添加了一个可选的注释,但是我很好奇,如果您的设置有些不同,需要使用'USE_GETTERS_AS_SETTERS'。 – Perception

+0

我又试了一次。不适合我的环境。我正在使用杰克逊2.1.1。这是我得到的错误 {“message”:“格式错误的json传递给服务器,使用了不正确的数据类型:\ n反序列化'setterless'属性'money':get方法返回null(通过引用链:com.abc。 def.Money])“ } –

相关问题