2017-12-06 8 views
2

ObjectMappercom.fasterxml.jackson.databind)は、不明なプロパティを無視するように指定できます。これは、クラスレベルで@JsonIgnoreProperties(ignoreUnknown = true)を追加するか、マッパーでデフォルトの動作として設定することで実行できます。しかし、のinitialize()メソッドでこれを行うと、効果がないようです。無視するように設定するためのDropwizard ObjectMapperを設定します。

ObjectMapper mapper = bootstrap.getObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

これは、構成ファイルの未知のプロパティでも失敗します。不明なプロパティを無視するようにDropwizardを設定するにはどうすればよいですか?

+0

DWのバージョンは何ですか? –

+0

私が持っているバージョンは0.7.1です。どうやら、新しいバージョンにはModelMapperを実際に設定する機能が追加されていますが、このバージョンでは、以前の設定に関係なく、 'FAIL_ON_UNKNOWN_PROPERTIES'に' true'フラグが適用されています。 – Myone

答えて

0

あなたがしてその機能を無効にする必要があります。

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

UPDATE:機能は、APIのリソースのためではなく、構成YAMLのための作品を無効にします。代わりに、あなたは以下の注釈を追加する必要があります(同じ質問で述べたように)設定クラスに:

@JsonIgnoreProperties(ignoreUnknown = true) 
+0

いいえ、残念ながらそれは動作しません。私は(1)無効にして(2)最初に無効にしてから 'false'に設定してみましたが、両方ともエラーが出ました:' *認識できないフィールドはblablaですか? – Myone

+0

私が使っているDropwizardのバージョン(0.7.1)が、あなたが設定を何に設定しても明らかにModelMapperの 'true'フラグを強制していることをここに追加できます。 – Myone

+0

@マイヨン私はDW 0.7.1でこの機能を無効にするだけのテストをしてくれました。私はこれのための単純なアプリケーションを作成しました:https:// github。com/andremanuelbarbosa/SOQ47676034 –

1

所望の効果を持っていません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を作成するファクトリをオーバーライドするための手段を提供しますそれ、ConfigurationFactoryFactoryBoostrap.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_PROPERTIEScopyをオーバーライドするだけでなく、追加のコンストラクタとともに実装することに注意してください。

上記の解決策は、明らかに回避策ですが、代わりに新しいDropwizardバージョンにアップグレードすることをお勧めします。新しいDropwizardでは、ObjectMapperの設定を簡単にすることができます(たとえば、this Dropwizard commitをDropwizard 1.1.xで利用可能)。

関連する問題