有两个类ProjectSchemaPageSchema。后者取决于前者。

class ProjectSchema {}
class PageSchema {
    public PageSchema(ProjectSchema schema) {}
}


这些类表示JSON配置文件,并且都具有自定义JsonDeserializer

class PageSchemaDeserialiser extends JsonDeserializer<PageSchema> {
    @Override
    public PageSchema deserialize(JsonParser parser, DeserializationContext context) {}
}


问题

为了完全初始化PageSchema中的PageSchemaDeserialiser对象,我需要在那里的ProjectSchema实例。

当我开始将TreeNode解析为PageSchema时,我已经构造了ProjectSchema

ProjectSchema projectSchema = ...;
...
new ObjectMapper().treeToValue(node, PageSchema.class);


我想让解串器知道这一点。我看到DeserializationContext方法需要使用deserialize。我想知道我是否能够在此处传递项目模式,因此在页面模式构建期间将可用。



归结为一个问题:

如何用特定于域的对象填充DeserializationContext,以便可以在反序列化期间使用它们?

最佳答案

我花了一些时间才发现DeserializationContext包含InjectableValues,并且可以将它们传递给ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.setInjectableValues(new InjectableValues.Std(myMap));

PageSchema schema = mapper.readValue(inputStream, PageSchema.class);


PageSchemaDeserialiser中,我打电话

Object myValue = context.findInjectableValue("myKey", null, null);


它解决了问题,但却带来了新的问题。现在,我应该在共享的InjectableValues实例中跟踪ObjectMapper

关于java - 如何用特定于域的对象填充DeserializationContext,以便可以在反序列化期间使用它们?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57628926/

10-10 04:26