首页 > 解决方案 > Rest - InvalidDefinitionException - 无法使用抽象类构造实例

问题描述

我正在尝试调用 POST 端点并通过 Postman 在请求正文中将抽象类作为参数传递。根据“类型”,控制器应该知道要使用和反序列化哪个类,但不幸的是它不知道。

这是我的控制器:

@RestController
@RequestMapping("/api/v1/auth")
public class UserController {

    @PostMapping("/authenticate")
    public String authenticate(@RequestBody ProviderCredentials providerCredentials) {
        return "hello";
    }
}

这是我的抽象类:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.google.gson.JsonObject;
import com.test.utils.enums.LoginProvider;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = EmailProviderCredentials.class, name = "email"),
    @JsonSubTypes.Type(value = FacebookProviderCredentials.class, name = "facebook")
})
public abstract class ProviderCredentials {

    public String testString;
    public ProviderCredentials() {}
}

这是我的两个扩展抽象类的类:

public class EmailProviderCredentials extends ProviderCredentials {
    public EmailProviderCredentials(){

    }
}

public class FacebookProviderCredentials extends ProviderCredentials {
    public FacebookProviderCredentials(){

    }
}

我正在使用 Postman 创建发布请求,如下所示

邮递员截图

我得到这个错误:

{
    "timestamp": "2020-12-27T13:35:46.755+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Type definition error: [simple type, class com.test.utils.objects.ProviderCredentials]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.test.utils.objects.ProviderCredentials` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (PushbackInputStream); line: 1, column: 1]",
    "path": "/api/v1/auth/authenticate"
}

标签: javaspringrest

解决方案


推荐阅读