【问题标题】:findBy URI not working in Spring Data RestfindBy URI 在 Spring Data Rest 中不起作用
【发布时间】:2014-01-21 20:09:33
【问题描述】:

默认情况下,在 Spring Data Rest 中,实体的 @Id 是不公开的。根据 REST 规则,我们应该使用资源的 URI 来引用它。鉴于此假设,如果您将 URI 传递给 findBy 查询,它们应该可以工作,但它们不会。

例如,假设我在老师和学生之间有一对多的关系。我想按老师找学生。

List<Student> findByTeacher(Teacher teacher)

http://localhost:8080/repositories/students/search/findByTeacher?teacher=http://localhost:8080/repositories/teachers/1

这不起作用,因为框架正在尝试将教师 URI 转换为 Long。 我收到此错误消息“无法从 java.lang.String 类型转换为 java.lang.Long 类型”。

我错过了什么吗?

【问题讨论】:

标签: spring-data-rest


【解决方案1】:
  1. 你可以通过配置 web 初始化器来暴露 @Id

    //Web 初始化器 @配置 公共静态类 RespositoryConfig 扩展 RepositoryRestMvcConfiguration { @覆盖 受保护的无效configureRepositoryRestConfiguration( RepositoryRestConfiguration 配置){ config.exposeIdsFor(Teacher.class); } }

  2. 列表改成页面就好了

    列出 findByTeacher(教师老师)

Page<Student> findByTeacher(@Param("teacher) Teacher teacher, Pageable pageable);

还需要注意 @Param 注释与 Pageable 一起需要。后者是必需的,因为返回类型“Page”

3.最新快照,而不是里程碑工作正常

【讨论】:

  • 1.这是一个很好的解决方法。 2. 好点。 3. 我正在使用最新的快照,但它不工作。
  • 我正在使用最新的快照,它对我有用。可能问题出在其他地方?追踪?
  • ERROR AbstractRepositoryRestController - Failed to convert from type java.lang.String to type java.lang.Long for value 'http://localhost:8080/repositories/teachers/1'
【解决方案2】:

https://jira.spring.io/browse/DATAREST-502

根据您的 Spring Data 版本,它可以按您的意愿工作。如果您使用的是 Spring Data 2.4,则需要传递 URI。如果您使用的是以前的版本,则需要传递 id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2019-09-13
    • 2014-06-05
    • 2018-05-28
    • 2016-02-16
    • 2018-04-07
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多