2014-11-27 2 views
1

Я использую injectableValues ​​для обезвреживания json. Я делаю это так:Как «отменить» инъекционные ценности от objectMapper?

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(); 
} 

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

this.mapper.setInjectableValues(null); 

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

Вы знаете, как «отменить» инъекционные ценности? или как передать 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()); 
Смежные вопросы