所望の効果を持っていませんbootstrap.getObjectMapper()
ためDeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
を設定する理由は、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()
を介して。これは、設定を上書きし、ConfigurationFactory
にそれを渡すことはできませんプロキシと実際のObjectMapper
を置き換えることができます:
bootstrap.setConfigurationFactoryFactory(
(klass, validator, objectMapper, propertyPrefix) -> {
return new ConfigurationFactory<>(klass, validator,
new ObjectMapperProxy(objectMapper), propertyPrefix);
}
);
FAIL_ON_UNKNOWN_PROPERTIES
以下、それを可能にするための試みを無視しObjectMapperProxy
ためのコード:
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
をオーバーライドするだけでなく、追加のコンストラクタとともに実装することに注意してください。
上記の解決策は、明らかに回避策ですが、代わりに新しいDropwizardバージョンにアップグレードすることをお勧めします。新しいDropwizardでは、ObjectMapper
の設定を簡単にすることができます(たとえば、this Dropwizard commitをDropwizard 1.1.xで利用可能)。
DWのバージョンは何ですか? –
私が持っているバージョンは0.7.1です。どうやら、新しいバージョンにはModelMapperを実際に設定する機能が追加されていますが、このバージョンでは、以前の設定に関係なく、 'FAIL_ON_UNKNOWN_PROPERTIES'に' true'フラグが適用されています。 – Myone