杰克逊如何在没有制定者的情况下设置私人财产?

时间:2017-05-06 13:59:18

标签: java json jackson

我非常好奇杰克逊如何创建包含它的私有属性/字段的对象而没有setter,只使用对象空构造函数。

我问的原因是当我反序列化某些属性时,我想根据这些值自动设置其他属性。例如,我不想序列化图像,只是它的路径。一旦路径被反序列化,@JsonIgnore字段Image就可以加载实际图像。在反序列化对象的构造之后,尚未分配字段。从逻辑上讲,吸气剂没有被调用。那么什么巫毒魔法触动我的物体私处?

public class ItemTemplate {

    private String imagePath;

    public ItemTemplate() {
        System.out.println(imagePath); //Still null
    }

    public String getImagePath() {
        System.out.println(imagePath); //Not being called when deserializing.
        return imagePath;
    }
}

但是当杰克逊完成对这个对象的反序列化时,它已经设置了imagePath

1 个答案:

答案 0 :(得分:6)

第一条评论回答了标题中的问题。杰克逊使用reflection to access private and protected properties。这在某种程度上促使我尝试了imagePath字段的私有设置器。这个二传手确实被杰克逊使用,而不是直接访问该领域。在这个设置器中,我可以使用路径字符串设置实际图像,但仍然保持私密。