我有带存储库的基于Spring数据REST的应用程序
public interface CriterionRepository extends JpaRepository<Criterion, Long> {
}
而Criterion
是基类:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Criterion extends AbstractEntity {}
NameCriterion
是它的子类
@Entity
public class NameCriterion extends Criterion {
private final String name;
}
Spring数据REST将存储库导出为REST资源,您可以在http://localhost:8080/api/criteria/上访问它。
导出的资源如下:
{
"_embedded": {
"nameCriteria": [{
"_links": {
"self": {
"href": "http://localhost:8080/api/nameCriterion/1"
},
"nameCriterion": {
"href": "http://localhost:8080/api/nameCriterion/1"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/api/criteria"
},
"profile": {
"href": "http://localhost:8080/api/profile/criteria"
}
},
"page": {
"size": 20,
"totalElements": 1,
"totalPages": 1,
"number": 0
}
}
当我试图遵循自链接时,没有http://localhost:8080/api/nameCriterion/1的映射
不过,我可以跟踪http://localhost:8080/api/criteria/1,并且可以从NameCriterion
获得没有名称字段的响应
{
"_links": {
"self": {
"href": "http://localhost:8080/api/nameCriterion/1"
},
"nameCriterion": {
"href": "http://localhost:8080/api/nameCriterion/1"
}
}
}
我的假设是,在REST导出程序中定义的Jackson是一个问题,不能正确地处理抽象类Criterion
( JpaRepository
中使用的抽象类)作为聚合根。
为了使它正常工作,我应该申请什么杰克逊定制?
换句话说,我应该创建哪个Jackson模块?
发布于 2017-05-30 06:57:38
没有必要创建杰克逊模块。要为继承的实体使用单个表,可以使用@RestResource注释将它们标记为相同的资源:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "criteria")
public abstract class Criterion extends AbstractEntity {
}
@RestResource(rel = "criteria", path = "criteria")
@Entity
public class NameCriterion extends Criterion {
private String name;
}
@RestResource(rel = "criteria", path = "criteria")
@Entity
public class TitleCriterion extends Criterion {
private String title;
}
@RepositoryRestResource(path = "criteria", collectionResourceRel = "criteria", itemResourceRel = "criterion")
public interface CriterionRepository extends JpaRepository<Criterion, Long> {
}
因此,可以在一个输出中获得所有资源(NameCriterion和TitleCriterion):
GET http://localhost:8080/api/criteria
{
"_embedded": {
"criteria": [
{
"name": "name1",
"_links": {
"self": {
"href": "http://localhost:8080/api/criteria/1"
},
"nameCriterion": {
"href": "http://localhost:8080/api/criteria/1"
}
}
},
{
"title": "title1",
"_links": {
"self": {
"href": "http://localhost:8080/api/criteria/2"
},
"titleCriterion": {
"href": "http://localhost:8080/api/criteria/2"
}
}
}
]
}
}
GET http://localhost:8080/api/criteria/1
{
"name": "name1",
"_links": {
"self": {
"href": "http://localhost:8080/api/criteria/1"
},
"nameCriterion": {
"href": "http://localhost:8080/api/criteria/1"
}
}
}
GET http://localhost:8080/api/criteria/2
{
"title": "title1",
"_links": {
"self": {
"href": "http://localhost:8080/api/criteria/2"
},
"titleCriterion": {
"href": "http://localhost:8080/api/criteria/2"
}
}
}
工作示例。
https://stackoverflow.com/questions/43892985
复制相似问题