2013-05-15 90 views
1

即時得到此異常:推土機的NullPointerException與定製吸氣深映射

Field mapping error --> 
MapId: null 
Type: null 
Source parent class: com.ParentObject 
Source field name: field1 
Source field type: class com.OnOff1BitEnum 
Source field value: OFF 
Dest parent class: com.SubParent 
Dest field name: subParent.field2 
Dest field type: java.lang.Boolean java.lang.NullPointerException 
at org.dozer.util.ReflectionUtils.invoke(ReflectionUtils.java:270) 
at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.getDeepSrcFieldValue(GetterSetterPropertyDescriptor.java:116) 
at org.dozer.propertydescriptor.GetterSetterPropertyDescriptor.getPropertyValue(GetterSetterPropertyDescriptor.java:69) 
at org.dozer.fieldmap.FieldMap.getDestValue(FieldMap.java:141) 

這是測繪領域:

<mapping> 
    <class-a>com.ParentObject</class-a> 
    <class-b>com.SubParent</class-b> 

    <field custom-converter="com.OnOffEnumToBooleanConverter"> 
     <a>field1</a> 
     <b get-method="isField2">subParent.field2</b> 
    </field> 
</mapping> 

推土機我使用的版本是5.4.0

更新: 添加轉換器代碼到這個職位。 當我把這兒,這是沒有達到

public class OnOffEnumToBooleanConverter implements org.dozer.CustomConverter { 
/** 
* {@inheritDoc} 
*/ 
@Override 
public Object convert(Object dest, Object src, Class<?> destClass, Class<?> srcClass) { 
    if (src == null) { 
     return null; 
    } 
      if (src instanceof com.OnOff1BitEnum) { 
     boolean canonicalObject; 
     if ((com.OnOff1BitEnum) src == com.OnOff1BitEnum.ON) { 
      canonicalObject = true; 
     } else if ((com.OnOff1BitEnum) src == com.OnOff1BitEnum.OFF) { 
      canonicalObject = false; 
     } else { // Unreachable Code To Test 
      throw new MappingException("Converter " + this.getClass().getCanonicalName() + " used incorrectly. Arguments passed in were: " 
        + dest + " and " + src); 
     } 
     return canonicalObject; 
    } 
} 
+0

發佈您的轉換器com.OnOffEnumToBooleanConverter – user1697575

回答

1

也許是因爲你缺少「設置配置」,儘量明確地指定它,看看是否能解決它,或者在不同的錯誤發生時,例如一個破發點

<field custom-converter="com.OnOffEnumToBooleanConverter"> 
     <a>field1</a> 
     <b get-method="isField2" set-method="field2">subParent.field2</b> 
</field> 

UPDATE:

我不得不正確地格式化你的Java代碼,以便能夠讀取......這裏是你有「如果和別人」爲一個布爾值... ...有沒有問題第三個條件...只是仔細看看它:

if (src instanceof com.OnOff1BitEnum) 
{ 
    boolean canonicalObject; 
    if ((com.OnOff1BitEnum) src == com.OnOff1BitEnum.ON) 
    { 
    canonicalObject = true; 
    } 
    else 
    { 
    if ((com.OnOff1BitEnum) src == com.OnOff1BitEnum.OFF) 
    { 
     canonicalObject = false; 
    } 
    else 
    { // Unreachable Code To Test 
     throw new MappingException("Converter " + this.getClass().getCanonicalName() 
      + " used incorrectly. Arguments passed in were: " + dest + " and " + src); 
    } 
    } 
    return canonicalObject; 
} 

這是在您的原始代碼中沒有括號的「if else construct」的邪惡。 此外,您的「轉換」方法返回對象...所以你的「boolean canonicalObject」必須是「布爾 canonicalObject」不是原始類型。

應該是:

@Override 
public Object convert(Object dest, Object src, Class<?> destClass, Class<?> srcClass) 
{  
    if (src instanceof com.OnOff1BitEnum) 
    { 
     if ((com.OnOff1BitEnum) src == com.OnOff1BitEnum.ON) 
     { 
     return Boolean.TRUE; 
     } 
     else 
     { 
     return Boolean.FALSE; 
     } 
    } 
    return null; 
} 
+0

的源代碼,我想這一點,得到了同樣的錯誤 –

+0

我改變轉換器你的建議後,得到了同樣的錯誤 –