有选择地扩展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中实现它的最佳方法。