java - 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"
}
解决方案
推荐阅读
- bash - shell:如何用包含空格的新字符串替换字符串
- python - 根据现有模型字段数据在 Django 中对 QuerySet 进行排序和排名,仅限于前几个排名?
- python - 在使用按钮从数据库中删除行时需要帮助
- python - 在 Flask 应用程序中从 PDF 文件中提取文本
- importerror - 精益 3 立即挂起导入语句
- nginx - 非云 k8s 集群中具有静态 IP 地址的入口控制器
- grpc - 暴露网络上的 gRPC
- javascript - 想要将嵌套的 for 循环转换为递归,
- html - 如何将不同长度的文本 flexbox 元素与固定大小的 iframe flexbox 元素对齐?
- html - 网页大小比预期高两倍