当前位置: 首页 > 面试题库 >

自定义控制器镜像Spring数据Rest/Spring Hateoas生成类的格式吗?

左丘嘉言
2023-03-14
问题内容

我正在尝试做一些我认为应该非常简单的事情。我有一个Question对象,设置了spring-boot,spring-data-rest和spring-hateoas。所有基础知识都可以正常工作。我想添加一个自定义控制器,该控制器返回一个List<Question>与GET到我Repository/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文档的实现会导致一条路径,该路径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);
    }
}

这要归功于PersistentEntityResourceAssemblerArgumentResolverSpring用来PersistentEntityResourceAssembler为你注入的。结果正是你从一种存储库查询方法所期望的结果!



 类似资料:
  • 我想做一些我认为应该很简单的事情。我有一个对象,用spring-boot、spring-data-rest和spring-hateoas设置。所有的基本工作都很好。我希望添加一个自定义控制器,该控制器返回的url的格式与GET to my

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

  • 我有一个自定义文件,其中包含我所有图像的路径及其标签,我在一个数据框中加载使用: MyIndex有两列感兴趣的ImagePath和ClassName 接下来我做一些训练测试拆分和编码输出标签为: 我面临的问题是一次性加载的数据太大,无法放入当前的机器内存,因此我无法处理完整的数据集。 我曾尝试使用datagenerator,但不想遵循它遵循的目录约定,也无法消除增强部分。 问题是,是否有一种方法可

  • 我使用的是SpringBoot(1.4)、SpringData和jpa。使用我的表/实体之一的ID列(crudepository),我想生成自定义字符串。从一些特定的字符串加上创建数据和时间开始,以db中的下一个值结束。所以这里我不能使用,我需要一些本地查询,比如“selectnextvalue” 有没有更好的方法可以做到这一点。

  • 我有一个POJO类患者,具有以下特征: 现在从我的Rest控制器中,我只需要在json中发送患者的姓名、电话号码、电子邮件和地址。我希望json输出为 此处仅将检查成功/失败添加为标志。

  • 我在Spring boot data rest中使用MongoRepository,它工作得很好,不需要实现我自己的控制器。但是我想把“注册日期”放在我新创建的对象中,默认实现不支持这个。我需要实现我自己的自定义控制器,以便在每个新对象中添加额外的字段。问题是当我实现我自己的控制器时,HATEOAS停止工作。 存储库类: 控制器类: 带有此自定义控制器的有效负载如下所示: 没有我的自定义控制器的有