Используйте аннотацию @JacksonInject, чтобы указать, где значения должны поступать от устройства отображения/чтения объектов.
@Test
public void inject_global_context_object() throws Exception {
ContextObject ctx = new ContextObject();
mapper.setInjectableValues(new InjectableValues.Std()
.addValue(ContextObject.class, ctx));
DataNeedingContext data = mapper.readValue("{\"prop\":\"foo\"}",
DataNeedingContext.class);
assertThat(data.ctx, sameInstance(ctx));
assertThat(data.prop, equalTo("foo"));
}
@Test
public void inject_local_context_object() throws Exception {
ContextObject ctx = new ContextObject();
DataNeedingContext data = mapper.reader(DataNeedingContext.class)
.with(new InjectableValues.Std()
.addValue(ContextObject.class, ctx))
.readValue("{\"prop\":\"foo\"}");
assertThat(data.ctx, sameInstance(ctx));
assertThat(data.prop, equalTo("foo"));
}
public static class ContextObject {
}
public static class DataNeedingContext {
private final ContextObject ctx;
public String prop;
public DataNeedingContext(@JacksonInject ContextObject ctx) {
this.ctx = ctx;
}
}
Не было бы проще просто сделать это в конструкторе ваших объектов? Таким образом, контекст будет определен и задан, как только объект будет создан, затем Джексон вызовет соответствующие сеттеры для установки значений, считанных из JSON. – Marged