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

时间:2015-05-13 16:20:32

标签: 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();

    String getEmail();

    BusinessModel getBusiness();
}

服务存储库:

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

对于/users它工作正常,业务领域是用嵌套实体公开的,但当我调用/users/1时 - 什么都没有,也是所有的自定义方法..看起来像投影不涉及任何/users以外的方法 有任何想法吗?

2 个答案:

答案 0 :(得分:30)

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

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

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

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

Spring Data REST reference documentation

中详细了解此主题

答案 1 :(得分:0)

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

BusinessModel getBusinessInline() { return this.businessModel; }

将产生JSON负载:

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

假设您的消费服务会接受,然后是一个选择。

不大也不聪明,但是可以。