我有一个模型类,我想包装以便输出REST服务。
SELECT
输出是
行的jsonpublic 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
答案 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映射框架可以轻松实现复制构造函数并使其保持最新。