为什么对Spring数据REST项资源不自动应用摘录投影?
我做了一个投影,它应该显示嵌套的实体:为什么对Spring数据REST项资源不自动应用摘录投影?,spring,spring-mvc,spring-data,spring-data-rest,Spring,Spring Mvc,Spring Data,Spring Data Rest,我做了一个投影,它应该显示嵌套的实体: @Projection(name = "inlineBusiness", types = { UserModel.class }) public interface InlineBusinessUserModelProjection { String getUsername(); String getFirstName(); String getLastName(); Date getBirthdate();
@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> {..}
@RepositoryRestResource(collectionResourceRel=“users”,path=“users”,
摘录投影=InlineBusinessUserModelProjection.class)
公共接口UserRepository扩展BaseDAO{..}
对于/users
来说,它工作得很好,业务字段是用嵌套的实体公开的,但是当我调用/users/1
时,没有任何内容,也没有所有自定义方法。。除了/users
有什么想法吗 按设计工作。每当在
\u embedded
子句中使用目标类型(UserModel
)的实例时,就会使用摘录投影。因此,摘录是一种预览,在资源本身未呈现但指向的任何地方使用。这通常是集合资源或关联的情况
从另一个角度来看,默认情况下在项目资源上使用摘录投影没有任何意义:摘录投影是某些域对象上的只读视图。如果默认情况下为项目资源返回该视图,那么客户机如何知道必须发送哪些数据来更新资源。根据定义,为摘录投影创建的JSON文档不能简单地获取、修改和用于发送PUT
请求以更新资源
如果要将投影应用于项资源,请使用投影的名称填充projection
URI模板变量
编辑:如果手动选择投影,则无法应用投影,请确保InlineBusinessUserModelProjection
已注册以供一般使用确保类型位于与UserModel
非常相同的包或子包中,或者通过RepositoryRestConfiguration.projectionConfiguration().addProjection(…)
手动注册投影。手动配置使投影类型上的@Projection
的使用过时
请阅读。中有关此主题的更多信息。我不打算与@Oliver Drotbohm争论,因为这确实是正确的答案,但是,如果您想要一个厚颜无耻的解决方法,只需使用稍微不同的名称为实体字段定义一个getter(使用OP的示例): 将导致JSON有效负载为:
{
.
.
"businessInline": {"name":"stuff etc"}
.
.
}
假设您的消费服务会接受这一点,那么这是一种选择
不算大,也不算聪明,但很管用。谢谢,现在我明白了。但不知何故,即使我向
/users/1
提供?projection=inlineBusiness
,它也不起作用。。在/alps/users/
内部也没有任何关于inlineBusiness的通知。/users/1/projection=inlineBusiness
也没有给出任何信息。我已经编辑了我的答案,并对一般用途的投影注册进行了评论。太好了!非常感谢你。顺便说一下,最好使用“手动登记投影”部分更新文档。另一点-没有任何信息表明投影必须位于实体的sand包或子包中。@OliverGierke根据最新的Spring数据REST文档,@projection永远不会过时:在任何一种情况下,投影的接口都必须有@projection注释。
{
.
.
"businessInline": {"name":"stuff etc"}
.
.
}