Как "сбросить" injectableValues из objectMapper?
Я использую InjectableValues для десертиализации JSON. Я делаю это так:
final InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue(HttpRestResponse.class, response);
emailsResponse = this.prepareCustomMapper().reader(EmailsResponse.class).withInjectableValues(injectableValues)
.readValue(response.getBody());
protected ObjectMapper prepareCustomMapper() {
if (this.mapper == null) {
this.mapper = new ObjectMapper();
this.mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.mapper.setSerializationInclusion(Inclusion.NON_NULL);
}
return this.mapper;
}
Итак, это работает отлично. Моя проблема в том, что когда я не хочу вводить значения, я делаю это так:
EmailResponse emailResponse = this.prepareCustomMapper().readValue(response.getBody(), EmailResponse.class);
И на этот раз я получаю это исключение:
java.lang.IllegalStateException: No 'injectableValues' configured, can not inject value with id [com.despegar.cross.commons.utils.restutils.HttpRestResponse]
at org.codehaus.jackson.map.deser.StdDeserializationContext.findInjectableValue(StdDeserializationContext.java:101)
at org.codehaus.jackson.map.deser.impl.PropertyValueBuffer.inject(PropertyValueBuffer.java:54)
at org.codehaus.jackson.map.deser.impl.PropertyBasedCreator.startBuilding(PropertyBasedCreator.java:111)
at org.codehaus.jackson.map.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:892)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:739)
это мои конструкторы EmailResponse.class:
// I use this one if i want to inject HttpRestResponseObject
public EmailResponse(@JacksonInject final HttpRestResponse request) {
super();
this.request = request
}
public EmailResponse() {
super();
}
Итак, я пришел к выводу, что вводимое значение, которое я установил при отображении первого объекта Mapper, сохраняется при отображении второго объекта Mapper, и оно пытается ввести значение в конструктор, который его не получает. Я попытался вставить в prepareCustomMapper() это, поэтому я подумал, что он будет "очищать" введенные значения при каждом вызове:
this.mapper.setInjectableValues(null);
Но это тоже не сработало.
Вы знаете, как "сбросить" injectableValues? или как передать injectableValues для текущего отображения, которое не будет сохраняться в будущем. Спасибо теперь!
1 ответ
Вы можете ввести нулевое значение:
final InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue(HttpRestResponse.class, null);
emailsResponse = this.prepareCustomMapper().reader(EmailsResponse.class).withInjectableValues(injectableValues)
.readValue(response.getBody());