Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么对Spring数据REST项资源不自动应用摘录投影?_Spring_Spring Mvc_Spring Data_Spring Data Rest - Fatal编程技术网

为什么对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"}
    .
    .
}