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

nKo*_*ito 18 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();
}
Run Code Online (Sandbox Code Playgroud)

和服务存储库:

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

因为/users它工作正常,业务领域暴露与嵌套实体,但当我调用/users/1- 没有,也所有自定义方法..似乎投影不参与任何方法除了/users 任何想法?

Oli*_*ohm 33

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

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

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

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

Spring Data REST参考文档中阅读有关此主题的更多信息.