使用ObjectMapper
(com.fasterxml.jackson.databind
)可以指定它应该忽略未知属性。这可以通过在类级别添加@JsonIgnoreProperties(ignoreUnknown = true)
或在映射器中将其设置为默认行为来完成。但是,在initialize()
的{{1}}方法中执行此操作时,它似乎没有效果。
Application<MyConfiguration>
配置文件中的未知属性仍然失败。如何配置Dropwizard忽略未知属性?
答案 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)