配置Dropwizard ObjectMapper以进行配置以忽略未知

时间:2017-12-06 13:56:06

标签: dropwizard objectmapper

使用ObjectMappercom.fasterxml.jackson.databind)可以指定它应该忽略未知属性。这可以通过在类级别添加@JsonIgnoreProperties(ignoreUnknown = true)或在映射器中将其设置为默认行为来完成。但是,在initialize()的{​​{1}}方法中执行此操作时,它似乎没有效果。

Application<MyConfiguration>

配置文件中的未知属性仍然失败。如何配置Dropwizard忽略未知属性?

2 个答案:

答案 0 :(得分:2)

DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES配置bootstrap.getObjectMapper()没有达到预期效果的原因是ConfigurationFactory(稍后用于解析配置的类)正在启用对象的特定功能映射器在其构造函数中(参见here):

public ConfigurationFactory(Class<T> klass,
                            Validator validator,
                            ObjectMapper objectMapper,
                            String propertyPrefix) {
    ...
    this.mapper = objectMapper.copy();
    mapper.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    ...
}

无法直接更改ConfigurationFactory的行为,但Dropwizard提供了通过ConfigurationFactoryFactory覆盖创建它的工厂Boostrap.setConfigurationFactoryFactory()的方法。这允许使用不允许覆盖配置并将其传递给ObjectMapper的代理替换真实ConfigurationFactory

  bootstrap.setConfigurationFactoryFactory(
      (klass, validator, objectMapper, propertyPrefix) -> {
          return new ConfigurationFactory<>(klass, validator,
              new ObjectMapperProxy(objectMapper), propertyPrefix);
      }
  );

ObjectMapperProxy的代码忽略了在下面启用FAIL_ON_UNKNOWN_PROPERTIES的尝试:

private static class ObjectMapperProxy extends ObjectMapper {

    private ObjectMapperProxy(ObjectMapper objectMapper) {
        super(objectMapper);
    }

    private ObjectMapperProxy(ObjectMapperProxy proxy) {
        super(proxy);
    }

    @Override
    public ObjectMapper enable(DeserializationFeature feature) {
        // do not allow Dropwizard to enable the feature
        if (!feature.equals(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)) {
            super.enable(feature);
        }
        return this;
    }

    @Override
    public ObjectMapper copy() {
        return new ObjectMapperProxy(this);
    }

}

请注意,除了覆盖enable以跳过FAIL_ON_UNKNOWN_PROPERTIES copy之外,还会实现(连同其他构造函数),因为ConfigurationFactory要求对象映射器支持复制。

虽然上面的解决方案有效,但它显然是一种解决方法,我建议升级到更新的Dropwizard版本。新的Dropwizard使ObjectMapper配置更容易覆盖(例如,请参阅Dropwizard 1.1.x中提供的this Dropwizard commit)。

答案 1 :(得分:1)

您需要使用以下功能禁用该功能:

bootstrap.getObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

更新:功能禁用适用于API资源,但不适用于配置YAML。相反,您需要在下面添加注释(与问题中提到的相同)到配置类:

@JsonIgnoreProperties(ignoreUnknown = true)