Как «сбросить» injectableValues из objectMapper?

1

Я использую 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();
}

Итак, мой вывод заключался в том, что инъекционная ценность, которую я установил при первом сопоставлении объектных карт, сохраняется во втором сопоставлении объектных матриц и пытается вставить значение в конструктор, который его не получает. Я пробовал вставлять в prepareCustomMapper() это, поэтому таким образом я думал, что он будет "чистить" injectedValues каждый раз, когда он был вызван:

this.mapper.setInjectableValues(null);

Но это не сработало.

Вы знаете, как "отменить" инъекционные ценности? или как передать injectableValues для текущего отображения, которое не сохранилось в будущем. Спасибо, теперь!

Теги:
jackson
mapper
constructor-injection

1 ответ

1
Лучший ответ

Вы можете ввести значение "null":

final InjectableValues.Std injectableValues = new InjectableValues.Std();
    injectableValues.addValue(HttpRestResponse.class, null);
    emailsResponse = this.prepareCustomMapper().reader(EmailsResponse.class).withInjectableValues(injectableValues)
        .readValue(response.getBody());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню