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

Myo*_*one 5 dropwizard objectmapper

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

ObjectMapper mapper = bootstrap.getObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)

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

rai*_*dev 7

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

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

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

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

该代码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);
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,除了覆盖enable跳过之外,FAIL_ON_UNKNOWN_PROPERTIES copy还实现了(与额外的构造函数一起),因为ConfigurationFactory需要对象映射器支持复制。

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


And*_*osa 3

您需要通过以下方式禁用该功能:

bootstrap.getObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Run Code Online (Sandbox Code Playgroud)

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

@JsonIgnoreProperties(ignoreUnknown = true)
Run Code Online (Sandbox Code Playgroud)