为啥没有自动为 Spring Data REST 项目资源应用摘录投影?

Posted

技术标签:

【中文标题】为啥没有自动为 Spring Data REST 项目资源应用摘录投影?【英文标题】:Why is an excerpt projection not applied automatically for a Spring Data REST item resource?为什么没有自动为 Spring Data REST 项目资源应用摘录投影? 【发布时间】:2015-07-25 01:35:06 【问题描述】:

我做了一个应该暴露嵌套实体的投影:

@Projection(name = "inlineBusiness", types =  UserModel.class )
public interface InlineBusinessUserModelProjection 

    String getUsername();

    String getFirstName();

    String getLastName();

    Date getBirthdate();

    String getEmail();

    BusinessModel getBusiness();

以及服务存储库:

@RepositoryRestResource(collectionResourceRel = "users", path = "users",
       excerptProjection = InlineBusinessUserModelProjection.class)
public interface UserRepository extends BaseDAO<UserModel> ..

对于/users,它工作正常,业务字段与嵌套实体一起公开,但是当我调用/users/1 时,什么都没有,还有所有自定义方法。似乎除了@ 之外的任何方法都没有涉及投影987654325@ 有任何想法吗?

【问题讨论】:

【参考方案1】:

按设计工作。只要在_embedded 子句中使用目标类型的实例(在您的情况下为UserModel),就会使用摘录投影。因此,摘录是在资源本身未呈现但指向的任何地方使用的某种预览。这通常是收集资源或协会的情况。

从另一个角度来看,默认情况下在项目资源上使用摘录投影并没有真正意义:摘录投影是某些域对象的只读视图。如果默认情况下为项目资源返回该视图,客户端如何知道它必须发送哪些数据来更新资源。为摘录投影创建的 JSON 文档不能简单地被获取、修改并用于发送 PUT 请求以更新资源 - 根据定义。

如果您想对项目资源应用投影,请使用投影名称填充 projection URI 模板变量。

编辑:如果您手动选择投影时未应用投影,请确保 InlineBusinessUserModelProjection 实际上已注册为一般用途。 确保该类型位于与UserModel 完全相同的包或子包中。 或者通过RepositoryRestConfiguration.projectionConfiguration().addProjection(…) 手动注册投影。手动配置使得在投影类型上使用@Projection 已过时。

在Spring Data REST reference documentation 中阅读有关此主题的更多信息。

【讨论】:

谢谢,现在我明白了。但不知何故,即使我将?projection=inlineBusiness 提供给/users/1 - 它也不起作用.. 在/alps/users/ 内部也没有任何关于 inlineBusiness 的通知.. /users/1/projection=inlineBusiness 也一无所获 我已经编辑了我的答案,并附上了关于一般用途投影登记的备注。 太棒了!太感谢了。顺便说一句,最好使用“手动注册投影”部分更新文档。另一点 - 没有任何信息表明投影必须在实体的沙包或子包中。 @OliverGierke 根据最新的 Spring Data REST 文档,@Projection 永远不会过时:In either situation, the interface with your projection MUST have the @Projection annotation.【参考方案2】:

我不会与@Oliver Drotbohm 争论,因为这确实是正确的答案,但是,如果您想要一个厚颜无耻的解决方法,只需为实体字段定义一个名称稍有不同的 getter(使用 OP 的示例):

BusinessModel getBusinessInline()  return this.businessModel; 

将产生以下 JSON 负载:


    .
    .
    "businessInline": "name":"stuff etc"
    .
    .

假设您的消费服务会接受这一点,那么它就是一个选项。

不大也不聪明,但它确实有效。

【讨论】:

以上是关于为啥没有自动为 Spring Data REST 项目资源应用摘录投影?的主要内容,如果未能解决你的问题,请参考以下文章

初入spring boot(八 )Spring Data REST

带有 Hikari 的 Spring Data JPA:为啥 hikari 自动提交属性设置为“true”?

Spring Data REST API集成SpringfoxSwagger

为啥 Spring Rest 服务在第一次请求时很慢?

HAL浏览器无法在spring-data-rest中正确自动配置

使用 Spring Data REST 进行密码编码