BeanUtils выбрасывает исключение NullPointerException в hashCode()

Я использую org.apache.commons.beanutils.BeanUtilsBean копировать свойства между объектами. Но это бросает NullPointerException исключение в hashCode() метод. Когда я проверяю DB, prodcode собственность не null, Так что не стоит бросать NullPointerException,

мой DTOobject как ниже. Одна заметная вещь, я храню то же самое EquipmentDTO как детское оборудование в этом оборудовании. Все оборудование имеет одно и то же свойство. Поэтому я использую рекурсивный шаблон.

например. У одного родительского оборудования может быть много дочернего оборудования.

public interface Copiable {
     public Object copy();
}



public class EquipmentDTO implements Copiable {
    private Long equipid;
    private String prodcode;
    private List<EquipmentDTO > childEquipmentList;  // Recursively store child Equipment

    public EquipmentDTO () {
       super();
    }

    public Long getEquipmentid() {
       return equipid;
    }

    public void setEquipmentid(Long equipid) {
       this.equipid= equipid;
    }

    public String getProdcode() {
       return prodcode;
    }  
    public int hashCode() {
       return getProdcode().hashCode();
    }

        @Override
    public boolean equals(Object o){
       if(o == null)return false;

       if(!(o instanceof EquipmentDTO ) ) return false;

       EquipmentDTO other = (EquipmentDTO ) o;

       return this.prodcode.equals(other.getProdcode());

    } 
}

NullPointerException происходит только в производственной среде. Я использую Java 1.6, Oracle weblogic.

Обновить

BeanUtils фрагмент кода.

public static void copy(Object src, Object dest) {
     try {
        org.apache.commons.beanutils.BeanUtilsBean beanUtil = BeanUtilsBean.getInstance();
        beanUtil.getConvertUtils().register(false, true, 0);
        beanUtil.copyProperties(dest, src);
    } catch (InvocationTargetException ite) {
        //set dest to null if exception
        ite.printStackTrace();
        dest = null;
    } catch (IllegalAccessException iae) {
        //set dest to null if exception
        iae.printStackTrace();
        dest = null;
    }
}

Обновить

Вот трассировка стека.

Caused By: java.lang.NullPointerException
    at com.xxxx.xxxx.xxx.vo.EquipmentDTO.hashCode(EquipmentDTO.java:361)
    at java.lang.Object.toString(Object.java:219)
    at java.lang.String.valueOf(String.java:2826)
    at org.apache.commons.beanutils.BeanUtilsBean.copyProperties(BeanUtilsBean.java:246)

1 ответ

У вас есть исключение, потому что вы копируете в пустой dest боб, который имеет null значение в prodcode поле. Сюда dest.hashCode() выдает исключение и, как следствие, dest.toString() (который использует реализацию по умолчанию Object.toString() который вызывает хэш-код) также выбрасывает NullPointerException, toString() метод вызывается BeanUtilsBean сделать отладочный вывод:

if (log.isDebugEnabled()) {
    log.debug("BeanUtils.copyProperties(" + dest + ", " +
              orig + ")");
}

Так вот dest преобразуется в строку, вызывая NullPointerException,

Вообще в Java всегда предполагается, что для опубликованных объектов toString(), hashCode() а также equals() никогда не бросай исключения. Так что лучше починить hashCode() реализация с использованием:

String prodcode = getProdcode();
return prodcode == null ? 0 : prodcode.hashCode();

Или, если вы можете использовать Java-7:

return Objects.hashCode(getProdcode());
Другие вопросы по тегам