我正在使用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()中,因此通过这种方式,我认为每次调用它都会“清除” injectedValues:

this.mapper.setInjectableValues(null);


但这也不起作用。

您知道如何“重置” injectableValue吗?或如何为将来可能无法持续的当前映射传递injectableValues。从现在开始谢谢!

最佳答案

您可以注入“ null”值:

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

关于java - 如何从objectMapper“取消设置” injectableValues?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27173780/

10-12 03:39