【问题标题】:Spring MVC - REST endpoint for inheritance hierarchySpring MVC - 继承层次结构的 REST 端点
【发布时间】:2017-08-21 09:30:35
【问题描述】:

我正在为类层次结构使用JOINED 继承策略,如下所示:

abstract super class Product

concrete sub class Type1Product extends Product

concrete sub class Type2Product extends Product

现在我想创建一个 REST 端点,它允许用户发布数据并将其解析为产品的特定子类,确保任何类型的产品都具有相同的端点。所以类似于以下内容:

@RequestMapping(method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public Product save(@Valid Product product) {
        // ...
        return product;
    }

目前,当我尝试发布时,我收到一条错误消息,提示我无法初始化抽象类,因为 Spring 正在尝试创建 Product 实例,而不是正确子类型的实例。

我正在尝试做的事情可能吗?如果不是,那么在为继承层次结构制作这样的端点时,最佳实践或约定是什么?

【问题讨论】:

  • 如果您保持产品类别具体并在退货时退回特定产品可能会解决问题
  • 但这在概念上是不正确的,因为 Product 不应该单独存在。我不介意改变这种方法,只是想知道这种情况通常是如何处理的。

标签: java spring-mvc inheritance


【解决方案1】:

让我们看看你想要做什么,你试图反序列化一个对象,你告诉杰克逊它的产品是你的抽象类,你希望杰克逊自己找到具体的类。

这是无法实现的,这是有道理的,假设可以构建 jackson 以根据附加属性确定哪个具体类,好吧假设我们有两个没有附加属性的具体类,这里 jackson 将如何找到出来的具体类是什么?

当指定反序列化类时,默认构造函数将被调用,所以如果你的类是抽象类而无法工作,你需要每个具体类的端点,或者你需要一个 DTO 和模型映射器,你的 DTO 可以包含具体类和所有可能的属性和您的模型映射器应该依赖于 DTO 中指示的具体类,使用这种方法您可以在一个端点中完成。

【讨论】:

  • 我实际上并没有使用 Jackson,但我明白你在说什么,我也有同样的想法,所以我认为单独的端点/控制器是最好的方法?
  • @user3690467 你在用什么? spring 默认使用 jackson,你可以选择 DTO/modelmapper,我发现它是一个委托解决方案
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多