为啥没有自动为 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