为什么摘录投影不会自动应用于 Spring 数据 REST 项目资源?

Why is an excerpt projection not applied automatically for a Spring Data REST item resource?

我做了一个应该公开嵌套实体的投影:

@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- 什么都没有,所有自定义方法也是如此。似乎不涉及投影除了 /users 之外的任何方法 有任何想法吗?

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

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

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

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

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

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

BusinessModel getBusinessInline() { return this.businessModel; }

将产生 JSON 负载:

{
    .
    .
    "businessInline": {"name":"stuff etc"}
    .
    .
}

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

不大也不聪明,但很管用。