Spring Boot @RestController端点和Spring Data Rest投影

4

我正在开发一个Spring Boot应用程序,使用@RestController@RequestMapping注解来公开端点。

最近我发现了Spring Data Rest中定义的投影概念(@Projection注释接口和@RepositoryRestResource注释的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 和 short 字段等简短的元素信息。

你能解释一下你的目标是什么吗?@RestController用于手动创建任何RESTful端点,而@RepositoryRestResource用于将存储库更多或更少地公开为RESTful端点,因此您不必手动执行该操作。@Projection注释是一个spring-data特定的注释,允许自定义实体的公开方式。有一种更通用的方法可以在Json对象上使用视图,那就是Jackson的@JsonView:https://dev59.com/eX_aa4cB1Zd3GeqP6rNP#30307335 - 这是你想要的吗?关于重定向,您可以@Autowire其他控制器并调用Java方法。 - zapl
@zapl 我的目标是暴露包含自定义代码的RESTful端点,但使用Spring Data中实现的投影概念。我想要暴露一个实体的几个“版本”,但保持在端点和数据库之间发生的事情的控制。我希望通过相同的URL公开这些实体的不同投影,具体取决于包含所需投影的请求参数。@JsonView可能很有趣:我会研究一下,谢谢。虽然它可能不完全是我需要的。 - Eria
我刚刚编辑了我的问题,添加了关于我期望的结果的详细信息。 - Eria
1个回答

2

不是我正在寻找的,但谢谢。据我所知,这是基于类Page提供的一种方法,而我目前并没有使用它。但如果我找不到其他解决方案,这可能是一个解决办法。 - Eria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接