如果字段类型是与Jackson

时间:2016-11-03 20:50:01

标签: spring serialization interface jackson polymorphism

我想基于接口进行de / / serialize,我不能更改类,因为它们是第三方(org.springframework.data.mongodb.core.geo.GeoJson)

POJO:

public class Geofence {
    @Id
    private String id;
    private String topic;
    private Date expiresOn;
    private Map<String, String> properties;
    private GeoJson geometry;

    // getters and setters
}

几何字段可以是GeoJsonPolygonGeoJsonPoint

我还添加了这个MixIn类:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.EXISTING_PROPERTY,
        property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = GeoJsonPolygon.class, name = "Polygon"),
        @JsonSubTypes.Type(value = GeoJsonPoint.class, name = "Point")})
public abstract class GeoJsonMixIn implements GeoJson{

    @JsonProperty("type")
    public String getType() {
        return null;
    }

    @JsonProperty("coordinates")
    public Iterable<?> getCoordinates() {
        return null;
    }
}

如果我尝试反序列化对象(通过REST接口),如

{
    "expiresOn": "2017-01-01",
    "topic": "test",
    "properties": {
        "radius": 200
    },
    "geometry": {
        "type": "Point",
        "coordinates": [
          13.349997997283936,
          52.51448414445241
        ]
      }
}

我得到了这个例外:

无法读取文档:无法构造org.springframework.data.mongodb.core.geo.GeoJsonPoint的实例:找不到合适的构造函数,无法从Object值反序列化(缺少默认构造函数或创建者,或者可能需要添加/启用类型信息吗?)

在序列化上我得到:

无法使用带参数的构造函数NO_CONSTRUCTOR实例化org.springframework.data.mongodb.core.geo.GeoJson

这甚至可能吗?我怎样才能做到这一点?

一切正常,如果我不使用多态性 - 就像我将其改为

    private GeoJsonPoint geometry;

我的GeoJson实际上是一个Point。所以显然是一个合适的构造函数等。

1 个答案:

答案 0 :(得分:1)

可能为时已晚,但我遇到了和你一样的问题,我发现你需要在Spring上添加一个配置来启用GeoJsonModule。所以你需要创建一个Spring配置类,如果你还没有它,并添加它:

>>>abbr_dict["YOU"]
('YOU', 'Youtube')

SpringMongoDbConfig是我为编辑Spring Configuration而创建的类,选择你喜欢的类。

doc GeoJsonModule可以看出,它是序列化和反序列化的特定类。使用Abstract类的所有其他代码对我来说似乎没问题,这是要走的路。