【发布时间】:2020-07-06 11:41:54
【问题描述】:
我试图让一个安静的 API 在提供 JSON 对象时选择正确的类。
考虑以下类:
package org.acme.validation.model;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="genre")
@JsonSubTypes({@JsonSubTypes.Type(value=Comic.class, name="comic")})
public class Book {
public String genre;
public String getTitle() {
return "lolwut";
}
}
package org.acme.validation.model;
import com.fasterxml.jackson.annotation.JsonTypeName;
@JsonTypeName("comic")
public class Comic extends Book {
public String title;
public String getTitle() {
return this.title;
}
}
经过多次阅读(这是我的第一个 Java 项目),我尝试使用带有抽象类继承、接口实现和泛型类的 Jackson 注释反序列化,但没有任何效果。我想出了以下代码,当提供{ "genre": "comic", "title": "foobar" } 作为输入时,我希望返回foobar:
package org.acme.validation.resource;
import org.acme.validation.model.Book;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
@Path("/books")
public class BookResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public <T extends Book> String foobar(T book) {
return book.getTitle();
}
}
但我得到的只是
javax.ws.rs.ProcessingException:RESTEASY008200:JSON 绑定反序列化错误:javax.json.bind.JsonbException:解析运行时类型时出错类型:T
当我尝试抽象类继承时,我得到了
avax.ws.rs.ProcessingException:RESTEASY008200:JSON 绑定反序列化错误:javax.json.bind.JsonbException:无法创建实例
我错过了什么?
我正在通过 Quarkus,FWIW 运行应用程序。
【问题讨论】:
-
这能回答你的问题吗? Jackson - Deserialize using generic class
标签: java jackson jax-rs json-deserialization quarkus