【发布时间】:2015-02-07 16:39:49
【问题描述】:
我正在使用 Jersey 2.11 和 Jackson 2.4.0 实现 REST 后端以进行序列化。 我的实体如下所示:
public class Measurement {
public Measurement() {
super();
}
private Long id;
private Double lat;
private Double lon;
private Long timestamp;
private User owner;
}
在某些响应中,我希望将此实体序列化为 GeoJSON,而在其他响应中,将其序列化为带有 User.id 而不是 User 对象的 Measurement。因此,我编写了两个自定义 JsonSerializer,并将它们注册到我的 ObjectMapperResolver 类中。
@Provider
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper defaultMapper;
private final ObjectMapper geojsonMapper;
public ObjectMapperResolver() {
defaultMapper = createDefaultMapper();
geojsonMapper = createGeojsonMapper();
}
private static ObjectMapper createDefaultMapper() {
SimpleModule module = new SimpleModule();
module.addSerializer(Measurement.class, new MeasurementSerializer());
return new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT)
.registerModule(module);
}
private static ObjectMapper createGeojsonMapper() {
SimpleModule module = new SimpleModule();
module.addSerializer(Measurement.class, new GeoJSONSerializer());
return new ObjectMapper()
.enable(SerializationFeature.INDENT_OUTPUT)
.registerModule(module);
}
@Override
public ObjectMapper getContext(Class<?> type) {
if (type.equals(Measurement.class)) {
return geojsonMapper;
}
else {
return defaultMapper;
}
}
}
在当前设置中,每当测量被序列化时,其序列化为 GeoJSON。每当我的其他实体(确实包含测量)被序列化时,都会使用 defaultMapper。 我需要为单个实体类 (Measurement.class) 切换序列化器/映射器的可能性
最好的问候!
【问题讨论】:
-
如果您可以为不同的格式设置不同的媒体类型,则很容易实现。
-
不幸的是,我的 Angular 前端更喜欢只处理 JSON。
标签: java json serialization jersey jackson