当前位置: 首页 > 知识库问答 >
问题:

我可以让自定义控制器镜像Spring-Data-Rest/Spring-Hateoas生成的类的格式吗?

公孙志尚
2023-03-14

我想做一些我认为应该很简单的事情。我有一个question对象,用spring-boot、spring-data-rest和spring-hateoas设置。所有的基本工作都很好。我希望添加一个自定义控制器,该控制器返回列表 /questionsurl的格式与GET to myRepository的/questionsurl的格式完全相同,以便两者之间的响应兼容。

以下是我的控制器:

@Controller
public class QuestionListController {

    @Autowired private QuestionRepository questionRepository;

    @Autowired private PagedResourcesAssembler<Question> pagedResourcesAssembler;

    @Autowired private QuestionResourceAssembler questionResourceAssembler;

    @RequestMapping(
            value = "/api/questions/filter", method = RequestMethod.GET,
            consumes = MediaType.APPLICATION_JSON_VALUE,
            produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody PagedResources<QuestionResource> filter(
            @RequestParam(value = "filter", required = false) String filter,
            Pageable p) {

        // Using queryDSL here to get a paged list of Questions
        Page<Question> page = 
            questionRepository.findAll(
                QuestionPredicate.findWithFilter(filter), p);

        // Option 1 - default resource assembler
        return pagedResourcesAssembler.toResource(page);

        // Option 2 - custom resource assembler
        return pagedResourcesAssembler.toResource(page, questionResourceAssembler);
    }

}

选项1:依赖提供的SimplePagedResourceAssembler

此选项的问题是没有呈现必要的_links。如果能解决这个问题,这将是最简单的解决方案

选项2:实现我的开放资源汇编程序

这个选项的问题是,根据Spring-Hateoas文档实现QuestionResourceAssembler会导致QuestionResource几乎与Question重复,然后汇编程序需要手动复制两个对象之间的数据,我需要手工构建所有相关的_Links。这看起来像是浪费了很多努力。

怎么办?

我知道Spring在导出QuestionRepository时已经生成了执行所有这些操作的代码。我有什么方法可以利用这些代码并使用它,以确保控制器的输出是无缝的,并且可以与生成的响应互换吗?


共有1个答案

淳于健
2023-03-14

我找到了一种完全模仿Spring数据Rest行为的方法。诀窍在于结合使用PagedResourcesAssemblerPersistentEntityResourceAssembler的参数注入实例。简单地定义您的控制器如下...

@RepositoryRestController
@RequestMapping("...")
public class ThingController {

    @Autowired
    private PagedResourcesAssembler pagedResourcesAssembler;

    @SuppressWarnings("unchecked") // optional - ignores warning on return statement below...
    @RequestMapping(value = "...", method = RequestMethod.GET)
    @ResponseBody
    public PagedResources<PersistentEntityResource> customMethod(
            ...,
            Pageable pageable,
            // this gets automatically injected by Spring...
            PersistentEntityResourceAssembler resourceAssembler) {

        Page<MyEntity> page = ...;
        ...
        return pagedResourcesAssembler.toResource(page, resourceAssembler);
    }
}

由于存在PersistentEntityResourceAssemblerArgumentResolver,Spring使用它为您注入PersistentEntityResourceAssembler。结果正是您从存储库查询方法中期望的结果!

 类似资料:
  • 问题内容: 我正在尝试做一些我认为应该非常简单的事情。我有一个对象,设置了spring-boot,spring-data-rest和spring-hateoas。所有基础知识都可以正常工作。我想添加一个自定义控制器,该控制器返回一个与GET到我的 完全相同的格式,以便两者之间的响应兼容。 这是我的控制器: 选项1:依靠提供的 这个选项的问题是没有必要的渲染。如果有解决方案,那将是最简单的解决方案。

  • 我试图向RepositoryRestResource中自动生成的endpoint添加一些额外的业务逻辑。请参见下面的代码: 资源: 控制器: 我看过下面两篇stackoverflow的文章: 我可以让自定义控制器镜像Spring-Data-Rest / Spring-Hateoas生成的类的格式吗? 在自定义控制器方法的 Spring Boot 中启用 HAL 序列化 我觉得我很接近了,但我面临的

  • 从各种文件和TUT中,我获得并学到了以下几点: > Spring HATEOAS用于在我们通过Controller或RESTendpoint返回的实体中创建链接。我们有来扩展我们的实体或包装类来包装我们的实体以创建或添加链接。有几个注释和类可供使用,例如和。 可能有一些问题我还没有探索或了解,但我只是好奇我们如何将SDR结合到HATEOAS链接构建过程中?代表…说话。 所以,我只想将我公开的RES

  • 考虑到Spring数据存储库的自定义实现,我使用存储库上的带来所有HATEOAS生成的Goodnes: 现在,按照前面提到的文档,我已经用附加的简单方法创建了,用于介绍目的: 实施方式是: 我希望默认的SDR自动生成endpoint保持,只添加新的自定义方法/新的实现。我应该如何将这个自定义方法与spring-data REST/HATEOAS一起使用?使用简单的可以自动生成控制器endpoint

  • 问题内容: 问题是,Spring HATEOAS与Spring Data Rest有什么区别? 我觉得两者都可以做同样的事情,而且Spring Data Rest(作为Spring Data的一部分)似乎还活着。 https://github.com/spring-projects/spring-hateoas https://github.com/spring-projects/spring-d

  • 我正在使用Spring Boot、Spring Data REST、Spring HATEOAS、Hibernate、JPA。 我在应用程序中广泛使用Spring Data REST,并公开了实体的所有存储库。不幸的是,有些特殊的情况并不是那么容易管理的。其中之一是: 我有一个自定义控制器: 这里的问题是,覆盖这些endpoint时,我隐藏了Spring Data REST创建的/searchen