次の例のように、アプリケーションに(ドメインオブジェクトからDTOへ、およびその逆の)詳細なプロパティマッピングがあります。
...
<field>
<a>employee.id</a>
<b>employeeId</a>
</field>
...
DozerがドメインをDTOに変換すると、にマップemployee.id
されます。これで問題ありませんemployeeId
。
DozerがDTOをドメインに変換するemployeeId
と、id=employeeIdを持つ新しいEmployeeインスタンスにマップされます。
この深いプロパティマッピングのロジックを作成したいのですが、解決策がわかりません。実装CustomConverter
(または拡張DozerConverter
)しようとしましたが、Dozerはソースクラスと宛先クラスとして整数型を渡します(結果として整数を期待します)。
編集:より正確に言えば、私が必要としているのはemployee
、ドメインでDTOが0の null
場合にマップすることです。employeeId
これは可能ですか?
何かアドバイス?
回答に応じて編集:フィールドレベルのカスタムコンバーターの問題を解決します。前述のマッピングの代わりに、今私はこのようなものを持っています...
...
<field custom-converter="ManyToOneIdMapper" custom-converter-param="id">
<a>employee</a>
<b>employeeId</b>
</field>
...
ManyToOneIdMapperで私は持っています...
public class ManyToOneIdMapper implements ConfigurableCustomConverter{
//...
//parameter field declaration, setParameter and getParameter implementations etc.
//...
public Object convert(Object existingDestinationFieldValue, Object sourceFieldValue,
Class<?> destinationClass, Class<?> sourceClass) {
try {
if(sourceClass.equals(Integer.class)){
Integer src=(Integer)sourceFieldValue;
if(src==null || src==0)
return null;
String setterName=formatMethodName("set", getParameter());
Method setterMethod=destinationClass.getMethod(setterName, Integer.class);
Object instance=destinationClass.newInstance();
setterMethod.invoke(instance, src);
return instance;
}else{
if(sourceFieldValue==null)
return 0;
String getterName=formatMethodName("get", getParameter());
Method getterMethod=sourceClass.getMethod(getterName);
Object instance=getterMethod.invoke(sourceFieldValue);
return instance;
}
} catch (Exception e){}
return null;
}
/**
* @return - method name (most often setter or getter) according to fieldName.
* For example formatMethodName("get", "id") returns "getId"
*/
protected String formatMethodName(String methodPrefix, String fieldName){
String trimmedFieldName=fieldName.trim();
String firstLetter=String.valueOf(trimmedFieldName.charAt(0));
String capitalizedFirstLetter=firstLetter.toUpperCase();
String methodName=methodPrefix+""+capitalizedFirstLetter+""+fieldName.substring(1);
return methodName;
}
custom-converter-param
ドメインオブジェクトのidフィールドの名前です。その名前で、コンバーターでsetterメソッドまたはgetterメソッドを呼び出すだけです。おそらく、それは最も幸せな解決策ではありませんが、私の問題のシナリオでは機能します。