JSON 解析运行时类型的绑定反序列化错误
JSON binding deserialization error resolving runtime type
我正在尝试让 restful API 在提供 JSON 对象时选择正确的 class。
考虑以下 classes:
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 项目),我尝试使用具有抽象 class 继承、接口实现和通用 classes 的 Jackson 注释进行反序列化,但没有任何效果。我得到了以下代码,当提供 { "genre": "comic", "title": "foobar" }
作为输入时,我希望它是 return 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 Binding deserialization error: javax.json.bind.JsonbException: Error resolving runtime type for type: T
当我尝试抽象 class 继承时,我得到
avax.ws.rs.ProcessingException: RESTEASY008200: JSON Binding deserialization error: javax.json.bind.JsonbException: Can't create instance
我错过了什么?
我是 运行 通过 FWIW 的 Quarkus 应用程序。
我收到这些错误是因为 Jackson 与 JSON-B 冲突:我试图使用 Jackson 注释,但 pom.xml
包含 JSON-B 作为依赖项。我只需要在 pom.xml
中用 quarkus-resteasy-jackson
替换 quarkus-resteasy-jsonb
并且所有内容(通用 classes、抽象 class 继承、接口实现)都按预期工作。
我正在尝试让 restful API 在提供 JSON 对象时选择正确的 class。
考虑以下 classes:
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 项目),我尝试使用具有抽象 class 继承、接口实现和通用 classes 的 Jackson 注释进行反序列化,但没有任何效果。我得到了以下代码,当提供 { "genre": "comic", "title": "foobar" }
作为输入时,我希望它是 return 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 Binding deserialization error: javax.json.bind.JsonbException: Error resolving runtime type for type: T
当我尝试抽象 class 继承时,我得到
avax.ws.rs.ProcessingException: RESTEASY008200: JSON Binding deserialization error: javax.json.bind.JsonbException: Can't create instance
我错过了什么?
我是 运行 通过 FWIW 的 Quarkus 应用程序。
我收到这些错误是因为 Jackson 与 JSON-B 冲突:我试图使用 Jackson 注释,但 pom.xml
包含 JSON-B 作为依赖项。我只需要在 pom.xml
中用 quarkus-resteasy-jackson
替换 quarkus-resteasy-jsonb
并且所有内容(通用 classes、抽象 class 继承、接口实现)都按预期工作。