Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson-在带有元数据的包装类中包装POJO-陷入无限循环_Java_Json_Jackson - Fatal编程技术网

Java Jackson-在带有元数据的包装类中包装POJO-陷入无限循环

Java Jackson-在带有元数据的包装类中包装POJO-陷入无限循环,java,json,jackson,Java,Json,Jackson,我有一个模型类,我想将其包装为REST服务输出 public class Model { private String name; // getter..setter; } public class Wrapper { private Model model; private Date modifiedDate; // getter..setter; } public class Converter extends StdConverter<Mo

我有一个模型类,我想将其包装为REST服务输出

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());
    }
}
问题是它似乎陷入了一个循环。不断尝试序列化模型,并将其嵌套在模型中

我已尝试添加
@JsonSerialize(converter=converter.class)
并设置
module.addSerializer(Model.class,新的StdDelegatingSerializer(新的Converter())在我的对象映射器中,但每次都得到相同的结果


使用jackson 2.8.5

可以创建
模型的代理
,并使用该代理创建
包装
。这样可以防止循环

public class Converter extends StdConverter<Model, Wrapper> {

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

我想用一种减少所需代码量的方法来修改@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
    }
}

复制构造函数可以通过使用bean映射框架(如Apache Beanutils或Dozer)轻松实现并保持最新状态。

是否可以先使用对象创建包装,然后序列化它?@nille85,这就是我们试图避免的!我只是觉得先创建一个包装,然后序列化它,是一个更优雅的解决方案,但这是一个品味的问题。我试着像你一样通过创建一个自定义序列化程序从StdSerializer扩展而来,但这也导致了StackOverflower错误。标记为正确答案,因为这是我使用的方法。我仍然觉得应该有更好的方法,但作为一个现实主义者,这就足够了!谢谢nille85
public class ModelProxy {

    private final Model model;

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

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

}
@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
    }
}