我做了一个应该暴露嵌套实体的投影:
@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
以外的方法
有任何想法吗?
答案 0 :(得分:30)
按设计工作。只要在UserModel
子句中使用目标类型的实例(在您的情况下为_embedded
),就会使用摘录投影。因此,摘录是在资源本身未呈现但指向的任何地方使用的某种预览。这通常来自收集资源或协会。
默认情况下,在项目资源上使用摘录投影从另一个角度来看并不合理:摘录投影是某些域对象的只读视图。如果默认情况下为项目资源返回该视图,客户端将如何知道必须发送哪些数据来更新资源。根据定义,无法简单地获取,修改和使用为摘录投影创建的JSON文档来发送PUT
请求以更新资源。
如果要将投影应用于项目资源,请使用投影名称填充projection
URI模板变量。
编辑:如果您手动选择投影时未应用投影,请确保InlineBusinessUserModelProjection
实际注册为一般用途。 确保该类型位于UserModel
的同一个包或子包中。或者通过RepositoryRestConfiguration.projectionConfiguration().addProjection(…)
手动注册投影。手动配置会使投影类型@Projection
的使用过时。
答案 1 :(得分:0)
我不会与@Oliver Drotbohm争论,因为这确实是正确的答案,但是,如果您想要一个轻松的解决方法,只需为实体字段定义一个具有稍微不同名称的getter(使用OP的示例) ):
BusinessModel getBusinessInline() { return this.businessModel; }
将产生JSON负载:
{
.
.
"businessInline": {"name":"stuff etc"}
.
.
}
假设您的消费服务会接受,然后是一个选择。
不大也不聪明,但是可以。