Java Spring MVC-继承层次结构的REST端点

Java Spring MVC-继承层次结构的REST端点,java,spring-mvc,inheritance,Java,Spring Mvc,Inheritance,我对一个类层次结构使用了连接的继承策略,如下所示: 抽象超类产品 具体子类Type1Product扩展产品 具体子类Type2Product扩展产品 现在我想创建一个REST端点,它允许用户发布数据并将其解析为产品的特定子类,确保任何类型的产品都具有相同的端点。因此,类似于以下内容: @RequestMapping(method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public Product s

我对一个类层次结构使用了
连接的
继承策略,如下所示:

抽象超类产品

具体子类Type1Product扩展产品

具体子类Type2Product扩展产品

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

@RequestMapping(method = POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public Product save(@Valid Product product) {
        // ...
        return product;
    }
目前,当我尝试发布时,我收到一个错误,说我无法初始化抽象类,因为Spring正在尝试创建一个产品实例,而不是正确子类型的实例


我想做的事可能吗?如果没有,那么在为继承层次结构创建这样的端点时,最佳实践或约定是什么?

让我们看看您正在尝试做什么,您正在尝试反序列化一个对象,并且您正在告诉jackson它的产品是您的抽象类,您希望jackson自己找到具体类是什么

这是不可能实现的,这是有意义的,让我们假设jackson可以被构建来找出基于附加属性的具体类,好吧,那么假设我们有两个没有附加属性的具体类,这里jackson将如何找出什么是具体类


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

如果您保持产品类的具体性,并在返回时返回特定的产品,这可能会解决问题,但这在概念上是不正确的,因为产品本身不应该存在。我不介意改变这种方法,只是想知道这样的情况通常是如何处理的。我实际上并没有使用Jackson,但我明白你的意思,我也有同样的想法,所以我认为单独的端点/控制器是最好的方法?@user3690467你在使用什么?spring默认使用jackson,您可以使用DTO/modelmapper,我发现它是一个委托解决方案