Java Jackson-将值传递给JsonDeserializer

Java Jackson-将值传递给JsonDeserializer,java,json,jackson,Java,Json,Jackson,我现有的类层次结构如下所示: public interface Service { String getId(); String getName(); } public class FooTask extends AbstractTask { private final static ObjectMapper JSON_MAPPER = new ObjectMapper(); static { JSON_MAPPER.registerModule(new Simple

我现有的类层次结构如下所示:

public interface Service {
  String getId();
  String getName();
}

public class FooTask extends AbstractTask {
  private final static ObjectMapper JSON_MAPPER = new ObjectMapper();

  static {
    JSON_MAPPER.registerModule(new SimpleModule().addDeserializer(Result.class, new ResultDeserializer());
  }

  public FooTask(Service service) {
    super(service);
  }

  @Override public Result call() throws Exception {
     InputStream json = <... execute some code to retrieve JSON ...>
     Result result = JSON_MAPPER.readValue(json, Result.class);
  }

  private static class ResultDeserializer {
    @Override public Result deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {

      //
      // Need to access service#getId() down here... but we're in a static nested class 
      // and I don't know how to access it. Is there some way to pass that info via the DeserializationContext?
      //

      <... Deserialization logic ...>
    }
  }
}
公共接口服务{
字符串getId();
字符串getName();
}
公共类FooTask扩展了抽象任务{
私有最终静态ObjectMapper JSON_MAPPER=new ObjectMapper();
静止的{
JSON_MAPPER.registerModule(新的SimpleModule().addDeserializer(Result.class,新的ResultDeserializer());
}
公众提问(服务){
超级(服务);
}
@重写公共结果调用()引发异常{
InputStream json=
Result-Result=JSON_-MAPPER.readValue(JSON,Result.class);
}
私有静态类ResultDeserializer{
@重写公共结果反序列化(JsonParser解析器,反序列化上下文ctx)引发IOException{
//
//需要访问下面的服务#getId(),但我们在一个静态嵌套类中
//我不知道如何访问它。有没有办法通过反序列化上下文传递这些信息?
//
}
}
}

我需要在反序列化时将一些信息传递给反序列化程序,但我找不到在反序列化时将一些上下文信息传递给反序列化程序的方法。这可能吗?如果可能,如何实现?我希望不必在每次实例化FootTask或#call()时都分配新的ObjectMapper方法被调用。

因此我提出了一个解决方案…不知道它是否是理想的解决方案,但它是一个解决方案-基本上我首先创建了一个InjectableValues的实例:

private InjectableValues newInjectableValues() {
  return new InjectableValues.Std()
    .addValue("providerId", service.getId())
}
ctx.findInjectableValue("providerId", null, null);
然后,我从ObjectMapper获取一个新的ObjectReader实例,并使用该实例执行反序列化:

JSON_MAPPER.reader(newInjectableValues()).withType(Result.class).readValue(inputStream)
在实际的反序列化程序中,我使用此方法检索InjectableValues提供的值:

private InjectableValues newInjectableValues() {
  return new InjectableValues.Std()
    .addValue("providerId", service.getId())
}
ctx.findInjectableValue("providerId", null, null);

你救了我一天。我一直在寻找如何做到这一点,你的解决方案很有魅力。