在我们的一个项目中,我们使用了一个与MongoDB实例对话的java webapp。在数据库中,我们使用DBRefs来跟踪一些对象关系。我们使用jackson (使用mongodb-jackson-mapper)对POJO对象进行(反)序列化。
然而,我们使用相同的POJO然后(反)序列化到外部世界,在那里我们的前端处理呈现JSON。
现在,我们需要一种让外部世界序列化的方法来包含来自DBRef的引用对象(以便UI可以呈现完整的对象),而我们显然希望将DBRef写入数据库,而不是整个对象。
现在我写了一些未经测试的静态嵌套类代码:
public static class FooReference {
public DBRef<Foo> foo;
// FIXME how to ensure that this doesn't go into the database?
public Foo getFoo() {
return foo.fetch();
}
}理想情况下,我希望有一种方法来注释它,这样我就可以(反)序列化它,可以使用或不使用getFoo()结果,这可能取决于某个配置对象。这个是可能的吗?你有没有看到一种更好的方法来做这件事?
发布于 2012-08-27 20:48:40
从选项来看,似乎可以将属性注释为仅当将给定的View传递给用于序列化的ObjectMapper时才显示。因此,您可以编辑该类:
public static class FooReference {
public DBRef<Foo> foo;
@JsonView(Views.WebView.class)
public Foo getFoo() {
return foo.fetch();
}
}并提供:
class Views {
static class WebView { }
}然后在创建具有正确视图的配置后进行序列化:
SerializationConfig conf = objectMapper.getSerializationConfig().withView(Views.WebView.class);
objectMapper.setSerializationConfig(conf);然后序列化它。在使用MongoDB包装器进行序列化时不指定视图将意味着该方法将被忽略。缺省情况下,不带JsonView注释的属性是序列化的,您可以通过指定以下内容来更改此行为:
objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);有关更多信息,请访问on the Jackson Wiki。
事实证明,还有其他选择:有Jackson MixIns可以让你在不修改类本身的情况下覆盖(反)类的部分序列化行为,在Jackson 2.0 (最近的版本)中也有filters。
发布于 2012-08-27 20:10:47
使用自定义JSONSerializer并在serialize方法中应用您的逻辑:
public static class FooReference {
public DBRef<Foo> foo;
@JsonSerialize(using = CustomSerializer.class)
public Foo getFoo() {
return foo.fetch();
}
}
public class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
// jgen.writeObjectField ...
}
}https://stackoverflow.com/questions/12141561
复制相似问题