Java Jackson-在带有元数据的包装类中包装POJO-陷入无限循环
我有一个模型类,我想将其包装为REST服务输出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
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
}
}