有选择地扩展Spring Data Rest响应中的关联

我有一个标准的Spring数据JPA和Spring数据Rest设置,它正确地返回关联作为正确资源的链接。

{ "id": 1, "version": 2, "date": "2011-11-22", "description": "XPTO", "_links": { "self": { "href": "http://localhost:8000/api/domain/1" }, "otherDomain": { "href": "http://localhost:8000/api/domain/1/otherDomain" } } } 

但是在某些请求中,我希望扩展与“otherDomain”的关联(因此客户端不必执行N + 1个请求来获取完整数据)。

是否可以配置Spring Data Rest以这种方式处理响应?

默认响应必须保持不变,以确保PUT请求的有效负载与GET返回的有效对称。 但是,Spring Data REST引入了一个名为projection的function(有关详细信息,请参阅JIRA票证 ),其工作方式如下:

您可以创建专用接口并添加要包含在响应中的所有属性:

 public interface MyProjection { String getMyProperty(); MyRelatedObject getOtherDomain(); } 

你也可以

  • 使用@Projection对接口进行注释,并将其放在与域类型或其子包相同的包中
  • 或者您使用RepositoryRestConfiguration手动注册投影,并手动调用projectionConfiguration().addProjection(…) (通过扩展RepositoryRestMvcConfiguration并覆盖configureRepositoryRestConfiguration(…) )。

这将导致为域类型公开的资源接受具有projection名称的projection参数(名称也可配置为ProjectionConfiguration )。 如果给出,我们将跳过默认渲染(包括渲染到相关实体的链接而不是嵌入它们),并让Jackson渲染代理支持给定的接口。

一个例子也可以在Spring RESTBucks项目中找到。 有关接口定义,请参阅OrderProjection

我的解决方案适用于所有请求,但有些人可能会发现它相关。

我有一个类似的情况,我将userPersons关联嵌套在我的User json响应中,如下所示:

 { "_embedded":{ "users":[ { "userName":"Albert" "userPersons":[ { "personId":2356, "activeBoolean":1 }, { "personId":123617783, "activeBoolean":1 } ], "_links":{ "self":{ "href":"http://localhost:8080/api/users/1" } } } ] 

}}

我的基本实体是这样的:

 @Entity public class User { ... @Getter @Setter private String userName; @Getter @Setter @OneToMany(mappedBy = "user") private Set userPersons; 

}

还有一个存储库:

 @RepositoryRestResource public interface UserRepo extends JpaRepository { } 

我的解决方案是:

通过简单地暴露用户@RepositoryRestResource,Spring Data Rest将嵌入您的关联。

如果为嵌套类型定义@RepositoryRestResource,Spring Data Rest将呈现资源的链接而不嵌入它。

如果需要内部业务逻辑的嵌套类型存储库,请将其设置为@RepositoryRestResource(exported = false),以具有相同的行为。

为了避免1 + N问题,你可以配置eager加载的关联,也许使用像这样的@EntityGraph – 虽然我还没有找到在Spring Data Rest中实现它的最佳方法。