原因解释:
- 在new 一个对象的时候,对象的ID是唯一确定的;
- 将对象add入list中时,放入list中的其实是对象的引用 ;
- 而每次循环只是简单 的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;
所以每次add之后,list发现对象引用和之前元素一样,就覆盖掉了之前add的对象。所以循环之后list中的对象是重复的对象。
解决方法:
想要避免这个问题只要每次add时保证对象引用都是不同的即可,即每循环一次重新new一个对象。new的对象应该放在for循环内,每循环一次重新new一个新对象
原来代码:
for (String qcId : qcIds) {
List<String> qcNames = qualityCheckDao.getQcNameByQcId(qcId);
if(null==qcNames||qcNames.size()<=0){
logger.error("质检规则id没有对应的规则名,借单号:" + checkBean.getBorrowNid()+",规则id:"+qcId);
return new ResponseEntity(Constants.System.FAIL, "质检规则id没有对应的规则名,借单号:" + checkBean.getBorrowNid()+",规则id:"+qcId);
}
newCheckBean.setQcName(qcNames.get(0));
qualityCheckBeans.add(newCheckBean);
}
解决代码:
for (String qcId : qcIds) {
QualityCheckBean newCheckBean = new QualityCheckBean();
try {
BeanUtils.copyProperties(newCheckBean,checkBean);
} catch (Exception e) {
e.printStackTrace();
}
List<String> qcNames = qualityCheckDao.getQcNameByQcId(qcId);
if(null==qcNames||qcNames.size()<=0){
logger.error("质检规则id没有对应的规则名,借单号:" + checkBean.getBorrowNid()+",规则id:"+qcId);
return new ResponseEntity(Constants.System.FAIL, "质检规则id没有对应的规则名,借单号:" + checkBean.getBorrowNid()+",规则id:"+qcId);
}
newCheckBean.setQcName(qcNames.get(0));
qualityCheckBeans.add(newCheckBean);
}