当前位置: 首页 > 知识库问答 >
问题:

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

胡新
2023-03-14
public interface CriterionRepository extends JpaRepository<Criterion, Long> {
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Criterion extends AbstractEntity {}
@Entity
public class NameCriterion extends Criterion {
    private final String name;
}

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

导出的资源如下所示:

{
    "_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
    }
}

当我尝试跟踪self链接时,没有http://localhost:8080/api/namecriterion/1的映射

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/nameCriterion/1"
        },
        "nameCriterion": {
            "href": "http://localhost:8080/api/nameCriterion/1"
        }
    }
}

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

共有1个答案

宗政昱
2023-03-14

不需要创建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):

json prettyprint-override">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"
    }
  }
}

工作实例。

 类似资料:
  • 假设有一个具有属性a的抽象类A和三个非抽象子类B、C和D。B没有附加属性,C包含属性c,D包含属性c和d。 我想为抽象类A的子类StdDeserializer能够根据要反序列化的属性的存在来决定选择哪个子类。 我以前用Codehaus的一些Jackson版本做到了这一点,它使用以下实现运行良好: 这很好,但从FasterXML ObjectMapper迁移到Jackson 2.4后,不允许Obje

  • 问题内容: 谁能用我的2.10 Scala模块指向一个简单的Jackson序列化/反序列化示例?我正在寻找不需要逐字段注释或分配的基于反射的JSON,这似乎可以做到这一点,但是他们的文档中没有示例。 如果我有案例课: 因此,从他们的github自述文件中: 好吧,现在…?如何将p转换为JSON? 问题答案: 试一下: 编辑 只需确保将类声明为顶级即可,否则它将无法正常工作。

  • web3.modules属性返回一个包含所有子模块类的对象,可以用来 手工实例化这些子模块类。 调用方法: Web3.modules web3.modules 返回值: Object: 子模块列表: Eth - Function: Eth模块类,用来与以太坊网络进行交互。参见web3.eth。 Net - Function: Net模块类,用来与网络属性进行交互。参见web3.eth.net。

  • 在本章中,我们将研究Drupal中的Aggregator Module 。 聚合器模块从其他网站获取内容,但不生成任何源。 它也被称为饲料阅读器。 它收集并显示来自其他网站和博客的文本和图像。 以下是启用聚合器模块的步骤。 Step 1 - 单击菜单栏中的Modules 。 Step 2 - 显示不同模块的列表。 启用Aggregator模块,然后单击Save Configuration ,如以下

  • 包基础 包是方法的集合 具有自己的命名空间 包方法能被导出或直接调用 Foo::bar() Foo->bar() bar() (如果 Foo 已导出它) 模块基础 模块是包含一个或多个包的文件 多数人交替使用模块和包 对象基础 对象是被 bless 的哈希引用(不必是哈希引用,但它最常见) bless 将单个类赋给对象 对象可被重新 bless 1; 模块必须以真值结束 不必是 1 包没有相同的

  • 无效: 有效: (运输是抽象的) 顺便说一句,我的所有jaxb类都在同一个包中,并且我的JaxbContext是针对这个包配置的。