首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson模块处理Spring数据REST中的抽象聚合根及其子类

Jackson模块处理Spring数据REST中的抽象聚合根及其子类
EN

Stack Overflow用户
提问于 2017-05-10 12:48:06
回答 1查看 220关注 0票数 5

我有带存储库的基于Spring数据REST的应用程序

代码语言:javascript
运行
复制
public interface CriterionRepository extends JpaRepository<Criterion, Long> {
}

Criterion是基类:

代码语言:javascript
运行
复制
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Criterion extends AbstractEntity {}

NameCriterion是它的子类

代码语言:javascript
运行
复制
@Entity
public class NameCriterion extends Criterion {
    private final String name;
}

Spring数据REST将存储库导出为REST资源,您可以在http://localhost:8080/api/criteria/上访问它。

导出的资源如下:

代码语言:javascript
运行
复制
{
    "_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获得没有名称字段的响应

代码语言:javascript
运行
复制
{
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/nameCriterion/1"
        },
        "nameCriterion": {
            "href": "http://localhost:8080/api/nameCriterion/1"
        }
    }
}

我的假设是,在REST导出程序中定义的Jackson是一个问题,不能正确地处理抽象类Criterion ( JpaRepository中使用的抽象类)作为聚合根。

为了使它正常工作,我应该申请什么杰克逊定制?

换句话说,我应该创建哪个Jackson模块?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-30 06:57:38

没有必要创建杰克逊模块。要为继承的实体使用单个表,可以使用@RestResource注释将它们标记为相同的资源:

代码语言:javascript
运行
复制
@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):

代码语言:javascript
运行
复制
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"
    }
  }
}

工作示例

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43892985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档