Spring data-rest不正确的资源href

Posted

技术标签:

【中文标题】Spring data-rest不正确的资源href【英文标题】:Spring data-rest incorrect resource href 【发布时间】:2017-03-18 18:05:00 【问题描述】:

我在使用 spring-data rest 和 spring-data jpa 获得正确的 url 以显示 self href 时遇到问题。

所以我有一个学生类:

@Entity
@Table(name="student", schema="main")
public class Student 

    @Id
    private Long id;

    ...
    ...

    @OneToOne
    @JoinColumn(name = "id")
    private StudentInformation studentInformation;

带有相应的存储库文件

@RepositoryRestResource(collectionResourceRel = "students", path = "students")
public interface StudentRepository extends PagingAndSortingRepository<Student, Long> 


还有一个 StudentInformation 类

@Entity
@Table(name="studentinformation", schema="main")
public class StudentInformation 

    @Id
    private Long id;

    ...
    ...

(省略其他属性/getter/setter)

有相应的仓库

@RepositoryRestResource(collectionResourceRel = "studentinformation", path = "students/studentinformation")
public interface StudentInformationRepository extends CrudRepository<StudentInformation, Long> 

当我通过 id 搜索学生时,学生的显示与我预期的一样,


  "id": 1,
  ...
  ...
  "_links": 
    "self": 
      "href": "http://localhost:8080/students/1"
    ,
    "student": 
      "href": "http://localhost:8080/students/1"
    ,
    "studentinformation": 
      "href": "http://localhost:8080/students/1/studentinformation"
    
  
 

除了当我点击从学生到 studentInformation 的链接时,studentInformation 的自我链接不正确。


  "id": 1,
  ...
  ...
  "_links": 
    "self": 
      "href": "http://localhost:8080/students/studentinformation/1"
    ,
    "studentinformation": 
      "href": "http://localhost:8080/students/studentinformation/1"
    
  

如何让该链接阅读 "href": "http://localhost:8080/students/1/studentinformation 代替 "href": "http://localhost:8080/students/studentinformation/1"

谢谢

【问题讨论】:

【参考方案1】:

首先,像students/studentinformation 这样的多段路径可能无法正常工作,因为它不受支持,请参阅this answer,因此不要专注于设计您的 URL。如果你真的需要http://localhost:8080/students/1/studentinformation 表示 - 你需要为此定义一个自定义控制器,不要依赖Spring Data REST

其次,使用projections 在/students 端点上拥有不同的学生数据不是更好吗?如果这只是 Student 资源的不同表示,我会选择预测,例如students/1?projection=minimalstudents/1?projection=full

如果studentinformation 包含与students 完全不同的数据并且它不是Student 资源的表示,只需为/studentinformation 定义一个端点。

【讨论】:

感谢您的回复。所以你是说没有办法在self href URL中堆叠资源?比如,http://localhost:8080/RESOURCE/id/SUB_RESOURCE 使用 @RepositoryRestResource?我必须定义自己的自定义 REST 控制器吗?这似乎很奇怪 不幸的是,您可以在我提供的链接中进行检查,至少不能在存储库中进行检查。如果你能找到任何方法来做到这一点 - 很高兴知道。可以通过使用您的自定义实现定义 @RepositoryRestController 并将其与您的资源相关联来完成它。 如果你想使用存储库实现,你可以做SUB_RESOURCE/ID?RESOURCE_ID=RESOURCE_ID

以上是关于Spring data-rest不正确的资源href的主要内容,如果未能解决你的问题,请参考以下文章

spring boot css 和 js 资源在某些情况下不加载

Spring Cloud Sleuth 日志中的应用程序名称不正确

Grails spring security oauth2 提供者对具有正确承载令牌的资源的请求重定向到登录

Silverlight C++ XRPack 版本不兼容&资源编译

如何为 Spring Boot/MVC 资源设置可识别的内容/MIME 类型?

如何正确使用 Spring Data 中的 PagedResourcesAssembler?