我想基于接口进行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
}
几何字段可以是GeoJsonPolygon
或GeoJsonPoint
。
我还添加了这个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。所以显然是一个合适的构造函数等。
答案 0 :(得分:1)
可能为时已晚,但我遇到了和你一样的问题,我发现你需要在Spring上添加一个配置来启用GeoJsonModule。所以你需要创建一个Spring配置类,如果你还没有它,并添加它:
>>>abbr_dict["YOU"]
('YOU', 'Youtube')
SpringMongoDbConfig是我为编辑Spring Configuration而创建的类,选择你喜欢的类。
从doc GeoJsonModule可以看出,它是序列化和反序列化的特定类。使用Abstract类的所有其他代码对我来说似乎没问题,这是要走的路。