杰克逊 - 在带有元数据的包装类中包装POJO - 陷入无限循环

时间:2017-01-13 11:58:33

标签: java json jackson

我有一个模型类,我想包装以便输出REST服务。

SELECT

输出是

行的json
public class Model {
    private String name;
    // getter..setter;
}

public class Wrapper {
    private Model model;
    private Date modifiedDate;
    // getter..setter;
}

public class Converter extends StdConverter<Model, Wrapper> {
    @Override
    public Wrapper convert(Model model) {
        return new Wrapper(model, new Date());
    }
}

问题是它似乎陷入了循环。不断尝试序列化模型,在其中嵌套。

我尝试添加{ "model": { "name" : "dave" }, "date": "tuesday" } 并在我的对象映射器中设置@JsonSerialize(converter = Converter.class),但每次都得到相同的结果。

使用jackson 2.8.5

2 个答案:

答案 0 :(得分:3)

您可以创建Model的代理并使用该代理创建Wrapper。这样你可以阻止循环。

public class Converter extends StdConverter<Model, Wrapper> {

    @Override
    public Wrapper convert(Model model) {
        return new Wrapper(new ModelProxy(model), new Date());
    }
}

ModelProxy的实现:

public class ModelProxy {

    private final Model model;

    public ModelProxy(final Model model) {
        this.model = model;
    }

    public String getName() {
        return model.getName();
    }

}

答案 1 :(得分:0)

我想用一种减少所需代码量的方法修改@ nielle85的答案。

方法是让ModelProxy扩展Model并使用注释禁用对它的转换,而不是使用聚合类。这样,所需要的只是一个复制构造函数。

示例代码:

@JsonSerialize(converter = ModelConverter.class)
public class Model {
   // Getters, setters and fields omitted.
}

@JsonSerialize(converter = Converter.None.class)
public class ModelProxy extends Model {
    public ModelProxy(Model model) {
        // Copy constructor
    }
}

使用Apache Beanutils或Dozer等bean映射框架可以轻松实现复制构造函数并使其保持最新。