使用excerptProjection时会忽略@JsonBackreference

时间:2017-03-02 09:39:18

标签: java spring-data-rest

在我的Spring Data Rest应用程序中,@JsonBackReference在定义excerptProjection时被忽略。

调用GET /foos/{id}时我会得到回复:(此处省略_link个元素)

{
  "text": "Foo",
  "additionalText": "Additional Text",
  "bar": {
    "text": "Bar",
    "_embedded": {
      "foo": {
        "text": "Foo",
        "bar": {
          "text": "Bar"
        }
      }
    }
  }
}

鉴于:

@Entity
public class Foo {

    @Id
    @GeneratedValue
    private Long id;

    private String text;

    private String additionalText;

    @JsonManagedReference
    @OneToOne(mappedBy = "foo", cascade = ALL)
    private Bar bar;
}

@Entity
public class Bar {

    @Id
    @GeneratedValue
    private Long id;

    private String text;

    @JsonBackReference
    @OneToOne
    private Foo foo;
}

使用存储库:

@RepositoryRestResource(excerptProjection = FooPublicProjection.class)
public interface FooRepository extends CrudRepository<Foo, Long> {}

如果删除excerptProjection定义,我会得到以下结果:

{
  "text": "Foo",
  "additionalText": "Additional Text",
  "bar": {
    "text": "Bar"
  }
}

如何让Spring Data Rest不在其自己的子节点中呈现Foo,我该怎么办?

1 个答案:

答案 0 :(得分:0)

这是一个解决方案,提供你使用杰克逊(我猜你这样做)。 在我的项目中,我使用JSOG来处理所有循环关系。我认为它也可以解决你的问题。

@Entity
@JsonIdentityInfo(generator = JSOGGenerator.class)
public class Foo {

    @Id
    @GeneratedValue
    private Long id;

    private String text;

    private String additionalText;

    @JsonManagedReference
    @OneToOne(mappedBy = "foo", cascade = ALL)
    private Bar bar;
}

@Entity
@JsonIdentityInfo(generator = JSOGGenerator.class)
public class Bar {

    @Id
    @GeneratedValue
    private Long id;

    private String text;

    @JsonBackReference
    @OneToOne
    private Foo foo;
}

请注意,如果您的客户端是javascript,那么可以使用补充的JSOG库来解析您的JSON并自动解决周期。