是否有可能使用多个配置的ObjectMappers
使用杰克逊的序列化/反序列化设置泽西岛?在泽西岛使用杰克逊与多个配置的ObjectMappers
我想做什么就能做的是注册一个“默认”杰克逊ObjectMapper
然后还要注册其他功能,它提供了一个ObjectMapper
有一些专门配置的能力即在某些情况下将“覆盖”的“默认” ObjectMapper
。
例如,这ContextResolver
将是 “默认” 的映射:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public JacksonMapperProvider() {
mObjectMapper = createMapper();
}
protected abstract ObjectMapper createMapper() {
ObjectMapper mapper = createMapper();
return mapper
.setSerializationInclusion(Include.ALWAYS)
.configure(JsonParser.Feature.ALLOW_COMMENTS, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mObjectMapper;
}
}
这ContextResolver
将覆盖 “默认” 的映射:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SpecializedMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public SpecializedMapperProvider() {
mObjectMapper = createMapper();
}
protected abstract ObjectMapper createMapper() {
ObjectMapper mapper = createMapper();
return mapper
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"))
.registerModule(new SpecializedModule1())
.registerModule(new SpecializedModule2());
}
@Override
public ObjectMapper getContext(Class<?> type) {
if(SomeType.isAssignableFrom(type)) {
return mObjectMapper;
}
return null;
}
}
我在JacksonJsonProvider
见Jackson支持ObjectMapper
提供者注入/解析的代码。然而,在实践中,我所看到的是供应商的“订单”似乎是随机的(我猜测它不是,但我不能理清如何控制订单)。有时“覆盖”出现在“默认”之前,一切正常,但在下次服务器启动时,订单会发生变化。
我试图得到这个在许多方面的工作,包括:
- 手动注册的
ContextResolver<ObjectMapper>
实现(在不同的顺序) - 通过
@Provider
注释 - 指定注册的
ContextResolver<ObjectMapper>
实现注册时优先
我使用的是以下产品:
- 泽西2.8
- 杰克逊2.3.3
也许我是把一个完全不正确的方法呢?
有没有更好的方法来实现我想要做的事情? 也许我应该只定义两个独立的JAX-RS应用程序,并且每个应用程序都有一个ObjectMapper配置?
我发现是什么,一旦你有'ObjectMapper defaultMapper =返回新ObjectMapper()',它与默认的'JacksonJsonProvider'实例不一样。至少不适用于'JacksonJaxbJsonProvider'。 – ulab