【发布时间】:2015-12-21 10:47:23
【问题描述】:
我目前正在开发一个使用 @RestController 和 @RequestMapping 注释公开端点的 Spring Boot 应用程序。
我最近发现了 Spring Data Rest 中定义的投影概念(@Projection-annotated 接口和 @RepositoryRestResource-annotated JPA 存储库),我想将此概念应用于我现有的服务。
据我了解这篇帖子Spring Boot Projection with RestController,(如果我错了,请纠正我),@RestController 和@RepositoryRestResource 类都定义了端点。所以这些注释看起来很不兼容。
是否有一个 Spring 组件可以简单地将投影概念应用于 @RestController 端点?
有没有办法手动将请求从一个端点重新路由到另一个端点? (例如,使用@RestController 端点作为某种代理,在将请求重新路由到@RepositoryRestResource 端点之前执行控制或其他操作)
编辑:我添加了我想要的最终代码的一瞥。
@RestController
public class MyController {
@RequestMapping(value = "/elements/{id}", method = RequestMethod.GET)
public ResponseEntity<Element> getElements(
@PathVariable("id") Integer elementId,
@RequestParam("projection") String projection,
@RequestHeader(value = "someHeader") String header{
// [manual controls on the header then call to a service which returns the result]
}
}
@Entity
public class Element {
private Integer id;
private String shortField;
private String longField;
private List<SubElement> subElements;
// [Getters & setters]
}
@Projection(name = "light", types = {Element.class})
interface ElementLight {
public Integer getId();
public String getShortField();
}
如果我调用/elements/4,我会得到 id = 4 的完整元素。
如果我调用/elements/4?projection=light,我只会得到 id = 4 的 Element 的 id 和短字段。
【问题讨论】:
-
你能解释一下你的目标是什么吗?
@RestControllers 用于手动创建任何 RESTful 端点,而@RepositoryRestResource用于将存储库或多或少 1:1 公开为 RESTful 端点,因此您不必手动执行此操作。@Projection注释是一个特定于 spring-data 的注释,它允许自定义实体的公开方式。有一种更通用的方法可以在 Json 对象上使用视图,那就是 Jackson 的@JsonView:stackoverflow.com/a/30307335/995891 - 这就是您所追求的吗? Wrt,重新路由,你可以@Autowire另一个控制器并调用java方法。 -
@zapl 我的目标是公开包含自定义代码的 RESTful 端点,但使用 Spring Data 中实现的投影概念。我想公开一个实体的几个“版本”,但要控制端点和数据库之间发生的事情。我想通过相同的 URL 公开实体的这些不同投影,具体取决于包含所需投影的请求参数。
@JsonView可能很有趣:我会调查一下,谢谢。虽然它可能不是我所需要的。 -
我刚刚编辑了我的问题以添加有关我期望的结果的详细信息。
标签: java spring rest spring-boot spring-data-rest