我使用Spring Boot开发了示例应用程序。我有一个抽象类(Employee
)和两个具体的子类,例如全职和兼职员工。
我更喜欢加入类型的继承和3个由JPA提供程序创建的表。
我还为Employee
创建了REST存储库。如下所示:
package com.caysever.repository;
import com.caysever.model.Employee;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
/**
* Created by alican on 04.05.2017.
*/
@RepositoryRestResource(path = "employee")
public interface EmployeeRepository extends JpaRepository<Employee, Long>{
}
当我在浏览器中调用**/employee**
网址时,我的内容如下:
{
"fullTimeEmployees" : [ {
"name" : "Alican",
"surname" : "Akkuş",
"birthDay" : "2017-05-04T12:37:20.189+0000",
"gender" : "MALE",
"totalWorkingHoursOfWeek" : 40,
"_links" : {
"self" : {
"href" : "http://localhost:8080/fullTimeEmployee/1"
},
"fullTimeEmployee" : {
"href" : "http://localhost:8080/fullTimeEmployee/1"
}
}
}
当我为第一位员工 localhost:8080/fullTimeEmployee/1
调用此网址时,我收到了404状态代码,但未找到。但我会通过此网址 localhost:8080/employee/1
获得第一名员工。
您可以在GitHub上看到所有代码 - &gt; https://github.com/AlicanAkkus/jpa-inheritance-strategy
为什么Spring REST会生成 fullTimeEmployee
网址?
答案 0 :(得分:0)
我认为使用@RepositoryRestResource修改导出详细信息,例如使用/ empoyee而不是默认值/ fullTimeEmployee
尝试
@RepositoryRestResource(collectionResourceRel = "fullTimeEmployees", path = "fullTimeEmployees")
或者如果您想使用/ employee
@RepositoryRestResource(collectionResourceRel = "employee", path = "employee")
路径设置要在其下导出此资源的段,collectionResourceRel设置在生成集合资源的链接时使用的值。
希望这有帮助
答案 1 :(得分:0)
一种解决方法是为具体类添加存储库接口,共享超类存储库的路径。
@RepositoryRestResource(collectionResourceRel = "employee", path = "employee")
public interface FullTimeEmployeeRepository extends JpaRepository<FullTimeEmployee, Long> {
}
@RepositoryRestResource(collectionResourceRel = "employee", path = "employee")
public interface PartTimeEmployeeRepository extends JpaRepository<PartTimeEmployee, Long> {
}
这将生成带有“员工”路径的链接,而不管子类的类型如何。
"_links" : {
"self" : {
"href" : "http://localhost:8080/employee/1"
},
"fullTimeEmployee" : {
"href" : "http://localhost:8080/employee/1"
}
}
我不知道是否有其他方法可以解决此问题。