杰克逊:无法反序列化START_OBJECT令牌中的Number实例

时间:2022-04-09 18:05:12

My GWT service returns LinkedList<VisualData>. This is how VisualData looks:

我的GWT服务返回LinkedList 。这是VisualData的外观:

import javax.xml.bind.annotation.XmlRootElement;
import com.google.gwt.user.client.rpc.IsSerializable;

@XmlRootElement
public class VisualData implements IsSerializable {
    private Number value;
    private long timestamp;

    public VisualData() {
    }

    public VisualData(Number value, long timestamp) {
        this.value = value;
        this.timestamp = timestamp;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public Number getValue() {
        return value;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public void setValue(Number value) {
        this.value = value;
    }
}

I get the following excepion connected with field private Number value.

我得到以下例外与字段私有号码值相关联。

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.Number out of START_OBJECT token
at [Source: org.apache.catalina.connector.CoyoteInputStream@a0eb51; line: 1, column: 29] (through reference chain: org.jage.charts.client.VisualData["value"])

When I change private Number value to private Object value, all getters and setters I get:

当我将私有Number值更改为私有Object值时,我得到所有getter和setter:

SEVERE: WebModule[/AgECharts]Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'org.jage.charts.client.VisualData' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = Value:{@type=xs:int, $=6}, timestamp:1360240281439
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619)

This second case is quite clear, the Object class is not serializable. But why do I get Can not deserialize instance of java.lang.Number out of START_OBJECT token?

第二种情况很清楚,Object类不可序列化。但是为什么我不能从START_OBJECT标记中反序列化java.lang.Number的实例?

1 个解决方案

#1


9  

You won't be able to deserialize data into this object without supplying additional type information for your value field. This is because the Number class is abstract and cannot be instantiated. Changing the field to Object will not help, since there are no writable fields on that class that Jackson can deserialize data into.

如果不为值字段提供其他类型信息,则无法将数据反序列化到此对象中。这是因为Number类是抽象的,无法实例化。将字段更改为Object将无济于事,因为该类上没有可写字段,Jackson可以将数据反序列化。

You should change the field to be one of the concrete implementations of the Number class (Integer, Long, Double etc).

您应该将该字段更改为Number类(Integer,Long,Double等)的具体实现之一。

#1


9  

You won't be able to deserialize data into this object without supplying additional type information for your value field. This is because the Number class is abstract and cannot be instantiated. Changing the field to Object will not help, since there are no writable fields on that class that Jackson can deserialize data into.

如果不为值字段提供其他类型信息,则无法将数据反序列化到此对象中。这是因为Number类是抽象的,无法实例化。将字段更改为Object将无济于事,因为该类上没有可写字段,Jackson可以将数据反序列化。

You should change the field to be one of the concrete implementations of the Number class (Integer, Long, Double etc).

您应该将该字段更改为Number类(Integer,Long,Double等)的具体实现之一。