如何检查 Jackson Deserializer 中是否设置了 Injectable Value
How to check if Injectable Value is set in Jackson Deserializer
我有一个扩展 JsonDerserializer<Type>
的 class。在这个反序列化器中,我有一个做替换值的概念,我目前使用 objectReader(Injectables) 设置它。我的问题是有时我没有注射剂。
我在 ObjectMapper
上没有看到允许我检查是否设置了可注入密钥的方法。我只看到 findInjectableValue
,如果该值不存在,它会抛出一个 InvalidDefinitionException
。我目前正在尝试接听这个有效的电话,但我觉得它更像是一个 hack。
有什么我遗漏的吗?
我真的不想拥有这个try-catch
。我想先检查是否存在可注射值。
try {
Object replacementValueObject = ctxt.findInjectableValue("replacementValues", null, null);
if (replacementValueObject instanceof Map) {
replacementValues = (Map<String, Object>) replacementValueObject;
mapper.setInjectableValues(new InjectableValues.Std().addValue("replacementValues", replacementValues));
}
}catch (InvalidDefinitionException ie){
logger.info("No replacement values exist. Ignoring and moving on");
}
现在(07-2019
),没有办法检查值是否存在。你只能 addValue and try to get it by invoking findInjectableValue.
您可以创建空 Map
并在创建 ObjectMapper
时初始化 InjectableValues
:
InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue("replacementValues", Collections.emptyMap());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setInjectableValues(injectableValues);
或者创建隐藏复杂逻辑的好方法:
class ReplaceMapValueJsonDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) {
return null;
}
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt, Object intoValue) throws IOException {
Map replacementValues = getCurrentReplacementValues(ctxt);
//...
return super.deserialize(p, ctxt, intoValue);
}
private Map<String, Object> getCurrentReplacementValues(DeserializationContext ctxt) {
try {
Object value = ctxt.findInjectableValue("replacementValues", null, null);
return (Map<String, Object>) value;
} catch (JsonMappingException ie) {
return Collections.emptyMap();
}
}
}
另请参阅:
- How to use injection with XmlMapper deserialization
我有一个扩展 JsonDerserializer<Type>
的 class。在这个反序列化器中,我有一个做替换值的概念,我目前使用 objectReader(Injectables) 设置它。我的问题是有时我没有注射剂。
我在 ObjectMapper
上没有看到允许我检查是否设置了可注入密钥的方法。我只看到 findInjectableValue
,如果该值不存在,它会抛出一个 InvalidDefinitionException
。我目前正在尝试接听这个有效的电话,但我觉得它更像是一个 hack。
有什么我遗漏的吗?
我真的不想拥有这个try-catch
。我想先检查是否存在可注射值。
try {
Object replacementValueObject = ctxt.findInjectableValue("replacementValues", null, null);
if (replacementValueObject instanceof Map) {
replacementValues = (Map<String, Object>) replacementValueObject;
mapper.setInjectableValues(new InjectableValues.Std().addValue("replacementValues", replacementValues));
}
}catch (InvalidDefinitionException ie){
logger.info("No replacement values exist. Ignoring and moving on");
}
现在(07-2019
),没有办法检查值是否存在。你只能 addValue and try to get it by invoking findInjectableValue.
您可以创建空 Map
并在创建 ObjectMapper
时初始化 InjectableValues
:
InjectableValues.Std injectableValues = new InjectableValues.Std();
injectableValues.addValue("replacementValues", Collections.emptyMap());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setInjectableValues(injectableValues);
或者创建隐藏复杂逻辑的好方法:
class ReplaceMapValueJsonDeserializer extends JsonDeserializer<Object> {
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) {
return null;
}
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt, Object intoValue) throws IOException {
Map replacementValues = getCurrentReplacementValues(ctxt);
//...
return super.deserialize(p, ctxt, intoValue);
}
private Map<String, Object> getCurrentReplacementValues(DeserializationContext ctxt) {
try {
Object value = ctxt.findInjectableValue("replacementValues", null, null);
return (Map<String, Object>) value;
} catch (JsonMappingException ie) {
return Collections.emptyMap();
}
}
}
另请参阅:
- How to use injection with XmlMapper deserialization