我找到了一种方法来实现我自己的序列化方法,扩展JsonSerializer<Foo>
,覆盖serialize()
方法并注册SimpleModule
所有内容。这就是我所拥有的:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonConfig implements ContextResolver<ObjectMapper> {
@Override
public ObjectMapper getContext(Class<?> aClass) {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
SimpleModule fooModule = new SimpleModule("FooModule",
new Version(0, 1, 0, null, "org.foo.bar", "foo"));
relationshipModule.addSerializer(Foo.class, new FooJacksonSerializer());
relationshipModule.addDeserializer(Foo.class, new FooJacksonDeserializer());
mapper.registerModule(fooModule);
return mapper;
}
}
但是,有没有办法使用两种自定义序列化策略,并根据REST请求(我使用RestEasy)选择正确的一种?即在运行时以程序方式更改它,而不是在设置上下文时。我希望有一个简洁的Foo
形式和详细的形式。
答案 0 :(得分:2)
您可以实现一个特殊的ObjectMapper并手动获取您需要的那个:
RC
在您的资源类中:
unsafe
我不知道你的目标是什么,但也许你也可以使用Jackson's JSON Views来实现它,或者定义像@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonConfig implements ContextResolver<ObjectMapper> {
private ObjectMapper objectMapper;
private SpecialObjectMapper specialObjectMapper; // a class extending ObjectMapper
public JacksonConfig() {
objectMapper = new ObjectMapper();
// configuration ...
specialObjectMapper = new SpecialObjectMapper();
// configuration with module ...
}
@Override
public ObjectMapper getContext(Class<?> clazz) {
return clazz == SpecialObjectMapper.class ? specialObjectMapper : objectMapper;
}
}
这样的自定义MediaType,并仅为此类型注册序列化器。