1

我有一个扩展类JsonDerserializer<Type>。在这个反序列化器中,我有一个替换值的概念,我目前使用 objectReader(Injectables) 设置。我的问题是有时我没有注射剂。

我没有看到ObjectMapper允许我检查是否设置了可注入密钥的方法。我只看到findInjectableValue如果值不存在,它会抛出一个InvalidDefinitionException. 我目前正在尝试接听这个有效的电话,但我觉得这更像是一种黑客行为。

有什么我想念的吗?

我真的不想拥有这个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");
}
4

1 回答 1

0

现在(07-2019),没有方法可以检查值是否存在。您只能addValue并尝试通过调用findInjectableValue来获取它。

您可以创建空并在创建时进行Map初始化:InjectableValuesObjectMapper

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

也可以看看:

于 2019-07-25T20:39:40.327 回答