【问题标题】:How to check if Injectable Value is set in Jackson Deserializer如何检查 Jackson Deserializer 中是否设置了 Injectable Value
【发布时间】:2019-07-25 20:08:30
【问题描述】:

我有一个扩展 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");
}

【问题讨论】:

    标签: java exception serialization jackson injectable


    【解决方案1】:

    目前(07-2019),没有办法检查值是否存在。您只能addValue 并尝试通过调用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();
            }
        }
    }
    

    另见:

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多