将Ebean查询的结果转换为JSON不起作用

wro*_*ame 0 playframework ebean playframework-2.0

现在我有

@Entity
public class Argument extends Model
{
    @Id
    public Long id;

    @Required @NotEmpty @Size(max = 140)
    public String summary;

    @SuppressWarnings("unchecked")
    public static Finder<Long, Argument> find = new Finder(Long.class, Argument.class);
    ...
}
Run Code Online (Sandbox Code Playgroud)

@Entity
public class Relation extends Model
{
    @Id
    public Long id;

    @Required @ManyToOne @NotNull @JsonManagedReference
    public Argument from;
    @ManyToOne @JsonManagedReference
    public Argument toArgument;
    @ManyToOne @JsonManagedReference
    public Relation toRelation;
    @Required @NotNull
    public Integer type;
    ...
}
Run Code Online (Sandbox Code Playgroud)

基本上,Relation将两个参数(或参数和另一个关系)链接在一起.这是两个班级之间的单向关系.然而我明白了

[RuntimeException: java.lang.IllegalArgumentException: Infinite recursion 
(StackOverflowError) (through reference chain: models.Argument["relations"]-> 
com.avaje.ebean.common.BeanList[0]->models.Relation["from"]-> 
models.Argument["relations"]-> ... ->models.Argument["relations"])
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:611) ~[jackson-databind.jar:2.2.2]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:142) ~[jackson-databind.jar:2.2.2]
    ...
Run Code Online (Sandbox Code Playgroud)

当我尝试做的时候

find.where().or(Expr.eq("from", argument), Expr.eq("toArgument", argument)).findList();
Run Code Online (Sandbox Code Playgroud)

然后打电话Json.toJson给那个结果.

添加@JsonBackReference到引用的字段Argument通过完全省略这些字段来解决问题,这不是我想要的.添加@JsonManagedReference可以保持问题不变,因为我没有看到任何地方添加@JsonBackReference- 这是一个单向的关系,它是真的!

基本上,我想要的只是涉及某个参数的JSON关系数组.表示关系的JSON对象应该只包含ID - 就像{id: 1, from: 4, toArgument: 3, type: 1}我想要的那样.

编辑我应该补充说,以前在Argument模型中工作正常的视图现在遇到相同的错误,当请求是在JSON中 - 尽管使用Arguments!当我甚至根本不改变参数时,为什么完全不同的类中的某些东西会影响参数呢?

wro*_*ame 5

最后解决了这个这个答案.我不得不补充一下

@OneToMany(fetch = FetchType.LAZY, mappedBy = "from") @JsonBackReference
public List<Relation> fromThis;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "toArgument") @JsonBackReference
public List<Relation> toThis;
Run Code Online (Sandbox Code Playgroud)

Argument.

不完全理解为什么,现在我得到了嵌入在JSON中的整个Argument对象 - 而不仅仅是ID,这就是我想要的.哦,我猜.