17

我有一个标准的 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 以这种方式处理响应?

4

2 回答 2

27

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

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

public interface MyProjection {

  String getMyProperty();

  MyRelatedObject getOtherDomain();
}

你可以

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

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

在Spring RESTBucks项目中也可以找到一个示例。参见OrderProjection接口定义。

于 2014-04-14T19:34:36.097 回答
1

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

我有一个类似的情况,我的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<Userperson> userPersons;

}

和一个单一的存储库:

@RepositoryRestResource
public interface UserRepo extends JpaRepository<User, Integer> {
}

我的解决方案是这样的:

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

如果你为嵌套类型定义了一个@RepositoryRestResource,Spring Data Rest 会渲染一个指向资源的链接而不是嵌入它。

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

为避免 1+N 问题,您可以配置关联以进行预加载,也许使用像this guy这样的 @EntityGraph - 尽管我还没有找到在 Spring Data Rest 中实现这一点的最佳方法。

于 2017-06-08T06:18:23.923 回答