2016-05-31 2 views
2

Orika 1.4.6を使用していて、CustomConverterを使用してフィールドの1つをマッピングしたいと考えています。ソースフィールドがNULLの場合、コンバータは呼び出されていないようです。ここに私のコードは次のとおりです。Orika:null値でCustomConverterが呼び出されない

class From { 
    String source; 
} 

class To { 
    String destination = "defaultValue"; 
} 

public class Mapper extends ConfigurableMapper { 

    private class MyConverter extends CustomConverter<String, String> { 

    @Override 
    public String convert(String source, Type<? extends String> destinationType) { 
     if (null == source) { 
     return "NULL!"; 
     } 
     return "->" + source + "<-"; 
    } 
    } 

    @Override 
    protected void configure(MapperFactory factory) { 

    factory.getConverterFactory().registerConverter("converter", new MyConverter()); 

    factory.classMap(From.class, To.class) 

     .fieldMap("source", "destination") 
     .mapNulls(true) 
     .converter("converter") 
     .add() 

    .register(); 
    } 
} 

私は次のオブジェクトマップする場合:私は、次を得るしかし

NULL! 

From from = new From(); //from.source == null 

Mapper mapper = new Mapper(); 
To to = mapper.map(from, To.class); 

System.out.println(to.destination); 

を私は次の出力を期待

null 

これは、コンバータ私は今

.mapNulls(false) 

を設定した場合は、ソースフィールド内のNULL値は無視される問題は、同じままなので

.mapNulls(true) 

の、すべてのヌル値を単純にコピーされる時に呼び出されていません宛先フィールドは変更されません(この場合、値「defaultValue」)。

たとえば、CustomMapperと組み合わせて「customize」メソッドを使用することは可能です。しかし、このソリューションは私の実際のアプリケーションではもっと複雑であり、そのためCustomConverterを使ったソリューションがはるかに適しているようです。

誰かがこの特定の例で問題がどこにあるか知っていますか?

乾杯、 ロバート

+0

私はCustomMapperを使用してあなたに受け入れられるソリューションを提供していますか? – Akah

+0

CustomMapperを使用したソリューションが正しく動作しています。しかし、私は、上にスケッチした解決策は、長期的には維持するのが簡単で簡単になると感じています。 また、この動作が意図的であるかどうかは不思議です。 – Robert

+0

これは良い解決策ですが、ソースが「ヌル」のときはコンバーターが使用されていないと思います。 CustomMapperはあなたの唯一の選択肢かもしれませんが、最後に私は彼らがプロジェクトのGoogleメーリングリストでアクティブであることを確認して、メンテナを尋ねることを検討してください。 – kab

答えて

1

観察された行動は意図的なものです。

null値を処理するカスタムコンバータを使用する代わりに、オブジェクト作成を処理するObjectFactoryを作成することができます。ここでは、デフォルト値を設定し、必要に応じて(つまり、ヌル以外のオブジェクトがマッピングされている場合)カスタムコンバータでデフォルト値を上書きすることができます。 注ここでは、動作するように、このため

.mapNulls(false) 

を設定するために持っています。

OrikaからこのソリューションのElaatifiに感謝します!