我正在使用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();
}
所以,我的结论是我在第一个objectMapper映射中设置的可注入值在第二个objectMapper的映射中持续存在,并且它试图将值注入到没有收到它的构造函数中。 我尝试将这个放入prepareCustomMapper()中,所以通过这种方式,我认为它会"清理"每次调用时注入的值:
this.mapper.setInjectableValues(null);
但这也没有用。
你知道怎么做" unset" injectableValues?或者如何为当前的映射传递injectableValues,以便将来继续存在。谢谢你们!
答案 0 :(得分: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());