Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jackson throw JsonMappingException无法构造的实例_Java_Json_Jackson_Jackson Databind - Fatal编程技术网

Java jackson throw JsonMappingException无法构造的实例

Java jackson throw JsonMappingException无法构造的实例,java,json,jackson,jackson-databind,Java,Json,Jackson,Jackson Databind,//接口 public interface NotificationPayload { } public ClassA implements NotificationPayload {...} public ClassB implements NotificationPayload {...} ... public ClassX implements NotificationPayload {...} //类实现接口 public ClassA implements Notification

//接口

public interface NotificationPayload {
}
public ClassA implements NotificationPayload {...}
public ClassB implements NotificationPayload {...}
...
public ClassX implements NotificationPayload {...}
//类实现接口

public ClassA implements NotificationPayload {...}
public ClassB implements NotificationPayload {...}
...
public ClassX implements NotificationPayload {...}
//要发送的消息

public class Notification<T extends NotificationPayload> {
    private T data; //T may be ClassA/ClassB/ClassC.../ClassX
    ...
}
我将其转换为:

Notification notif = objectMapper.readValue(json, Notification.class);
它会引发异常:

java.lang.IllegalArgumentException: Can not construct instance of 
com.common.kafka.notification.NotificationPayload: abstract types
either need to be mapped to concrete types, have custom deserializer, or
contain additional type information
at [Source: N/A; line: -1, column: -1] (through reference chain:
com.common.kafka.notification.Notification["data"])

我已经阅读了这个问题:但它似乎帮不上忙,因为我有太多的类从接口实现,而不仅仅是一次。

您需要使用jackson的注释来实现多态反序列化

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = ClassA.class, name = "ClassA"),
        @JsonSubTypes.Type(value = ClassB.class, name = "ClassB")
})
public interface NotificationPayload {
}

public class ClassA implements NotificationPayload {

    private Integer userId;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }
}

public class Notification <T extends NotificationPayload> {

    private T data; //T may be ClassA/ClassB/ClassC.../ClassX

    @JsonCreator
    public Notification(T data) {
        this.data = data;
    }

    public static void main(String[] args) throws IOException {

        String jsonStr = "{\"type\":\"ClassB\",\"userId\":10087}";

        ObjectMapper objectMapper = new ObjectMapper();
        Notification notification = objectMapper.readValue(jsonStr, Notification.class);
    }
}
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,
include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”)
@JsonSubTypes({
@JsonSubTypes.Type(value=ClassA.class,name=“ClassA”),
@JsonSubTypes.Type(value=ClassB.class,name=“ClassB”)
})
公共接口通知有效负载{
}
公共类ClassA实现NotificationPayload{
私有整数用户标识;
公共整数getUserId(){
返回用户标识;
}
public void setUserId(整数userId){
this.userId=userId;
}
}
公开课通知{
私有T数据;//T可以是ClassA/ClassB/ClassC…/ClassX
@JsonCreator
公共通知(T数据){
这个数据=数据;
}
公共静态void main(字符串[]args)引发IOException{
字符串jsonStr=“{\'type\':\'ClassB\',\'userId\':10087}”;
ObjectMapper ObjectMapper=新的ObjectMapper();
Notification Notification=objectMapper.readValue(jsonStr,Notification.class);
}
}
您可以找到的所有注释