Похоже, есть другой подход (спасибо одному из моих коллег), использующий injectableValues для экземпляра objectMapper и затем извлекающий зависимость через DeserializationContext ctxt.Ниже приведен код.
Модуль GUI ObjectMapper.
public class MerchantConverterModule extends AbstractModule {
@Override
protected void configure() {
}
@Provides
@Singleton
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
/**
* Add dependency object to object mapper.
*/
objectMapper.setInjectableValues(new InjectableValues
.Std()
.addValue("DependencyName", dependency));
return objectMapper;
}
}
Код вашего пользовательского десериализатора
public class CustomDeserializer extends StdDeserializer<String> {
private SomeDependecy dependency;
public StringDeserializer() {
this(null);
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return getDependency(ctxt).perform(p.getValueAsString());
}
private SomeDependency getDependency(DeserializationContext ctxt) {
SomeDependency dependency = (SomeDependency) ctxt
.findInjectableValue("DependencyName", null, null);
return dependency;
}
}
findInjectableValue
- это последний метод, поэтому вы можетеНужно настроить свой код модульного теста, чтобы макетировать финал.
ПРИМЕЧАНИЕ: Недостатком является то, что существует тесная связь между объектным картографом и десериализатором.