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 以忽略未知属性?
配置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 提交)。
您需要通过以下方式禁用该功能:
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)
| 归档时间: |
|
| 查看次数: |
4772 次 |
| 最近记录: |