gpt4 book ai didi

java - 如何从 objectMapper 获取 "unset"injectableValues?

转载 作者:行者123 更新时间:2023-11-30 11:11:54 36 4
gpt4 key购买 nike

我正在使用 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;
}

所以,这工作正常。我的问题是,当我不想注入(inject)值时,我会这样做:

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 的映射中设置的可注入(inject)值在第二个 objectMapper 的映射中持续存在,并且它试图将值注入(inject)到一个没有接收到它的构造函数中。我尝试将其放入 prepareCustomMapper() 中,所以通过这种方式,我认为每次调用时它都会“清理” injectedValues:

this.mapper.setInjectableValues(null);

但这也不起作用。

您知道如何“取消设置”injectableValues 吗?或者如何为将来不会持续存在的当前映射传递 injectableValues。从现在开始感谢!

最佳答案

您可以注入(inject)“空”值:

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 获取 "unset"injectableValues?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27173780/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com