Spring数据 - 休息不正确的资源href

时间:2016-11-04 19:37:46

标签: spring spring-data spring-data-jpa spring-data-rest spring-hateoas

我无法使用带有spring-data jpa的spring-data rest来获取正确的url以显示自我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;

    ...
    ...
}

(省略其他属性/ getters / setters)

带有相应的存储库

@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"
    }
  }
}

如何获取该链接     &#34; href&#34;:&#34; http://localhost:8080/students/1/studentinformation 代替     &#34; href&#34;:&#34; http://localhost:8080/students/studentinformation/1&#34;

由于

1 个答案:

答案 0 :(得分:1)

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

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

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