从 ResourceProcessor 中摘录投影和自定义链接
Excerpt Projection and Custom Links from ResourceProcessor
我正在使用 spring-data-rest 2.4.1 将实体公开为休息资源。
我还实现了 ResourceProcessor
以向资源添加自定义 link
@Component
public class MyEntityResourceProcessor implements ResourceProcessor<Resource<MyEntity>> {
@Override
public Resource<MyEntity> process(Resource<MyEntity> resource) {
resource.add(linkTo(methodOn(CustomController.class).getFeatures(resource.getContent().getId())).withRel("customRel"));
return resource;
}
}
这适用于单项资源。但我还设置了一个 ExcerptProjection 来减少集合资源中显示的属性:
@Projection(name = "myExcerptProjection", types = MyEntity.class)
interface MyExcerptProjection {
String getName();
String getSlogan();
}
当使用投影时,我的 MyEntityResourceProcessor
未被使用并且自定义 link 丢失。
我可以通过像这样为投影实现 ResourceProcessor 来引入 link:
public class MyEntityProjectionResourceProcessor implements ResourceProcessor<Resource<MyExcerptProjection>>
但我想避免这种情况,因为:
- 是代码重复
- 我在投影中缺少实体 ID,因此无法生成 link
关于如何让一个 ResourceProcessor 也适用于我的 ExcerptProjection 的任何想法?
我用我的问题创建了一个 JIRA 问题。
请看https://jira.spring.io/browse/DATAREST-713
答案是 spring 数据 rest 不能使用实体资源处理器进行投影,您也需要资源处理器进行投影。
为了避免代码重复,一个选项是引入一个既能投影又能连接实体的接口extend/implement。然后我们可以为这个接口实现一个资源处理器,它将应用于投影和实体。
我正在使用 spring-data-rest 2.4.1 将实体公开为休息资源。
我还实现了 ResourceProcessor
以向资源添加自定义 link
@Component
public class MyEntityResourceProcessor implements ResourceProcessor<Resource<MyEntity>> {
@Override
public Resource<MyEntity> process(Resource<MyEntity> resource) {
resource.add(linkTo(methodOn(CustomController.class).getFeatures(resource.getContent().getId())).withRel("customRel"));
return resource;
}
}
这适用于单项资源。但我还设置了一个 ExcerptProjection 来减少集合资源中显示的属性:
@Projection(name = "myExcerptProjection", types = MyEntity.class)
interface MyExcerptProjection {
String getName();
String getSlogan();
}
当使用投影时,我的 MyEntityResourceProcessor
未被使用并且自定义 link 丢失。
我可以通过像这样为投影实现 ResourceProcessor 来引入 link:
public class MyEntityProjectionResourceProcessor implements ResourceProcessor<Resource<MyExcerptProjection>>
但我想避免这种情况,因为:
- 是代码重复
- 我在投影中缺少实体 ID,因此无法生成 link
关于如何让一个 ResourceProcessor 也适用于我的 ExcerptProjection 的任何想法?
我用我的问题创建了一个 JIRA 问题。
请看https://jira.spring.io/browse/DATAREST-713
答案是 spring 数据 rest 不能使用实体资源处理器进行投影,您也需要资源处理器进行投影。
为了避免代码重复,一个选项是引入一个既能投影又能连接实体的接口extend/implement。然后我们可以为这个接口实现一个资源处理器,它将应用于投影和实体。