BeanUtils выбрасывает исключение NullPointerException в hashCode()
Я использую org.apache.commons.beanutils.BeanUtilsBean
копировать свойства между объектами. Но это бросает NullPointerException
исключение в hashCode()
метод. Когда я проверяю DB
, prodcode
собственность не null
, Так что не стоит бросать NullPointerException
,
мой DTO
object
как ниже. Одна заметная вещь, я храню то же самое 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());