gpt4 book ai didi

Jackson 模块用于处理 Spring Data REST 中的抽象聚合根及其子类

转载 作者:行者123 更新时间:2023-12-04 20:32:11 26 4
gpt4 key购买 nike

我有基于 Spring Data 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 Data 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 定制来使其正常工作?

换句话说,我应该创建什么 Jackson 模块?

最佳答案

无需创建 Jackson 模块。要为继承的实体使用单个表,我们可以使用 @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"
}
}
}

工作 example .

关于Jackson 模块用于处理 Spring Data REST 中的抽象聚合根及其子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com