2013-05-15 38 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

我改变转换器你的建议后,得到了同样的错误 –