我有一个 Foo 类,它引用了它自己。
这是我遇到的情况的粗略示例。
@Entity
public class Foo() {
@Column(name = "id", unique = true, nullable = false)
private Long id;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_Foo")
private Foo parent;
}
当我将 Foo 对象传递给 JSON 响应生成器时,所有必需的 getter 都会被启动,并且 JPA 从 DB 检索所有必需的数据。
现在的问题是,如果我从自引用字段中删除 @JsonIgnore,我将获得父信息和父父信息等。
我想要的是我可以限制检索到的父信息的深度。
例如。:
等
也许有一个带有注释或 smth 的简单解决方案,因为我找不到任何东西。
编辑:
使用自定义序列化程序和一些递归魔法解决了这个问题。
private void serializeParents(JsonGenerator gen, Foo value, int currentDepth) {
if (currentDepth < PARENTS_DEPTH) {
if (value.getMom() != null) {
serializeParentData(gen, value.getMom(), currentDepth);
}
if (value.getDad() != null) {
serializeParentData(gen, value.getDad(), currentDepth);
}
}
}
private void serializeParentData(JsonGenerator gen, Foo value, int currentDepth) {
gen.writeObjectFieldStart(Gender.M.equals(value.getGender()) ? "dad" : "mom");
// other parameters ...
serializeParents(gen, value, currentDepth + 1);
gen.writeEndObject();
}
最佳答案
我认为最好的方法是创建一个自定义 DTO 对象来收集您所有的 Foo
属性及其 parent
,因此您不会获得递归关系并避免延迟加载异常。
因此,您将保持实体原样:
@Entity
public class Foo() {
@Column(name = "id", unique = true, nullable = false)
private Long id;
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_Foo")
private Foo parent;
}
并创建一个自定义 DTO 对象,如下所示:
public class FooDto() {
private Long id;
private Foo parent;
//getters and setters here
}
然后你可以使用这个 DTO 在你的请求中存储 JSOn 结果。
你可以看看What is the point of using DTO (Data Transfer Objects)?了解更多详情。
@JsonIgnore
文档:根据 jackson
@JsonIgnore
documentation没有这样的选项(属性)来指定注释的深度/级别,因为只有一个可能的属性 value
定义此注释是否处于 Activity 状态。
关于java - 如何通过自引用处理实体的 RESTful 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42811471/