我在我的應用程序(從域對象DTO,和反向),類似於下面的例子深物業映射:與自定義轉換器推土機深屬性格式映射
...
<field>
<a>employee.id</a>
<b>employeeId</a>
</field>
...
當推土機轉換域名到DTO,它將employee.id
映射到employeeId
,那沒關係。
當Dozer將DTO轉換爲域時,它將employeeId
映射到id = employeeId的新Employee實例。
我想創建一些邏輯,爲這個深屬性映射,但我只是不能找出解決方案。我試圖執行CustomConverter
(或擴展DozerConverter
),但Dozer將Integer類型作爲源類和目標類傳遞給我(並期望Integer作爲結果)。
編輯: 更確切地說,我需要的是在域圖employee
到null
如果employeeId
在DTO是0
這可能嗎?
有什麼建議嗎?
根據答案編輯: 我解決了現場級自定義轉換器的問題。取代先前的,上面提到的,測繪,現在我有這樣的事情...
...
<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
在Domain對象僅僅是名稱ID場。用這個名字,我只是在我的轉換器中調用setter或getter方法。可能它不是最快樂的解決方案,但它適用於我的問題場景。
對於DTO->域的情況下,你想與ID這已經是持續在數據庫中執行員工的查找? – 2011-06-16 03:13:41
@Terrell Plotzki - 不完全。如果DTO.employeeId爲0或更少,我只想將Domain.employee設置爲null。我改變了我的問題。 – slomir 2011-06-16 09:40:17