2014-04-14 31 views
12

我有一个标准的Spring数据JPA和Spring数据Rest设置,它可以正确地将关联返回为正确资源的链接。在Spring Data 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来以这种方式处理响应?

+0

[spring-data-rest可能的重复,你可以提供实体的全部细节而不是(或与)链接](http://stackoverflow.com/questions/21975618/spring-data-rest-can-you - 提供完整的实体细节 - 而不是 - 或 - 与 - li) – bluish

回答

21

默认响应将保持不变,以确保PUT请求的有效负载与对应的GET的返回对称。然而,春季数据REST介绍了工作原理如下特征称为投影(见JIRA ticket了解详细信息):

您创建一个专用接口,并添加要在应对包括所有的属性:

public interface MyProjection { 

    String getMyProperty(); 

    MyRelatedObject getOtherDomain(); 
} 

您可以使用

@Projection,并将其放置在非常相同的封装域类型或它
  • 一个子包的接口
    • 注释或者您使用RepositoryRestConfiguration手动注册投影并手动呼叫projectionConfiguration().addProjection(…)(通过扩展RepositoryRestMvcConfiguration并覆盖configureRepositoryRestConfiguration(…))。

    这将导致暴露域类型的资源接受projection参数(名称也可配置ProjectionConfiguration)与突出的名称。如果给定,我们将跳过默认渲染(其中包括渲染指向相关实体的链接而不是嵌入它们),并让杰克逊渲染支持给定接口的代理。

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

  • +4

    是否有可能通过预测进一步向下扩展?例如,如果'otherDomain'本身后面的对象本身与'oneMoreDomain'有关联,那么这也可以添加到原始响应中吗? – muenchdo

    +1

    我想如果你的'MyProjection'的'getOtherDomain()'方法返回投影到'oneMoreDomain',那么它是可能的。 – djxak

    +1

    @Oliver Gierke,你救了我几口!这真的应该在官方文档,我不知道为什么它不是:(http://docs.spring.io/spring-data/rest/docs/2.2.1.RELEASE/reference/html/我其实想扩大一些'EAGER'协会默认投影,但我似乎无法做到这一点:(你知道怎么做?所以现在,“@投影”工作...提交https://jira.spring.io/browse/DATAREST-419 –

    0

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

    我有一个simular情况,在那里我有userPersons嵌套在我用户 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,春数据其余部分将嵌入您的关联。

    如果您为嵌套类型定义了@RepositoryRestResource,则Spring Data Rest将呈现到该资源的链接并且不嵌入它。

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

    为了避免1 + N问题,你可以配置关联加载,也许使用@EntityGraph,比如this guy - 尽管我还没有找到在Spring Data Rest中实现这个的最佳方法。

    相关问题