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

2024-03-06

我正在尝试做一些我认为应该非常简单的事情。我有一个Question对象,使用 spring-boot、spring-data-rest 和 spring-hateoas 设置。所有的基础工作都很好。我想添加一个返回一个的自定义控制器List<Question>与 GET 到我的格式完全相同Repository's /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:实现我的开源汇编器

该选项的问题在于实施QuestionResourceAssembler根据Spring-Hateoas 文档 https://github.com/spring-projects/spring-hateoas引向一条道路,其中QuestionResource最终几乎是重复的Question,然后汇编器需要在两个对象之间手动复制数据,我需要构建所有相关的_links用手。这看起来像是浪费了很多精力。

该怎么办?

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


我找到了一种完全模仿 Spring Data Rest 行为的方法。诀窍在于结合使用PagedResourcesAssembler和一个参数注入实例PersistentEntityResourceAssembler。只需按如下方式定义您的控制器...

@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为你。结果正是您对存储库查询方法之一所期望的结果!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以制作一个自定义控制器来镜像 Spring-Data-Rest / Spring-Hateoas 生成的类的格式吗? 的相关文章

随机推荐