【问题标题】:Jackson module to handle abstract aggregate root and its subclasses in Spring Data RESTJackson 模块用于处理 Spring Data REST 中的抽象聚合根及其子类
【发布时间】:2017-10-09 03:10:31
【问题描述】:

我有基于 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 得到没有name字段的回复

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

我的假设是 REST 导出器中定义的 Jackson 映射器存在问题,该映射器未正确调整以处理 JpaRepository 中使用的抽象类 Criterion 作为聚合根。

我应该应用什么 Jackson 自定义来使其正常工作?

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

【问题讨论】:

  • 如果我的回答对你有帮助请不要忘记接受! )

标签: jackson spring-data spring-data-rest


【解决方案1】:

无需创建 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

【讨论】:

  • 您的解决方案不能解决我的问题。我想在我的基类中保留@Inheritance 策略
  • @PatrikMihalčin 我已经更新了我的答案。可惜失去的赏金......))
  • 优秀。有用。我不知何故忘记了@RestResource。谢谢!正好赶上赏金 - 我有 24 小时的时间来授予它;)
  • @PatrikMihalčin 感谢您的赏金! ))
  • @PatrikMihalčin 你好!检查this... ;)
猜你喜欢
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2015-05-11
  • 1970-01-01
  • 2018-05-05
  • 2021-09-06
相关资源
最近更新 更多