在我最近的項目中,我使用jQuery Grid,當用戶點擊按鈕時生成動態網格。爲什麼多個DTO會更改會話映射?
在服務器端數據通過使用Session
來操縱。
首先,我得到Session
對象並將該對象轉換爲gatepassDTO
。
然後,我創建一個本地對象,並將屬性從舊對象複製到Map
。
之後,我創建futureDTO
對象和複製屬性從gatepassDTO
到futureDTO
。如果我更改futureDTO
中的任何內容,它將影響包含對象的地圖。
爲什麼會發生這種情況?
public String addOnemoreGatepass() {
log.info("----------------Entering method addOnemoreGatepass------------");
try {
Object map = session.get("gatepassMap");
GatepassDTO gatepassDTO = new GatepassDTO();
gatepassDTO=(GatepassDTO)session.get("gatepassDTO");
if(map!=null){
//gatepassMap=Collections.synchronizedMap((HashMap)map);
}
if(truckNo!=null){
gatepassDTO.setTruckNo(truckNo);
}
if(gpDirect!=null){
GatepassDTO tempDTO=new GatepassDTO();
copyProperty(tempDTO,gatepassDTO);
/* HashMap<String,GatepassDTO> maps=null;
if(gatepassNo.equals("1")){
maps=new HashMap<String, GatepassDTO>();
local.saveMap(getRequest().getSession().getId(),maps);
}
maps=local.loadMap(getRequest().getSession().getId());
maps.put(gatepassNo, tempDTO);*/
putCachedObject("SINGLEGATEPASSCACHE", gatepassNo, tempDTO);
gatepassMap.put(gatepassNo, tempDTO);
//local.saveMap(getRequest().getSession().getId(),maps);
session.put("documentType", documentType);
session.put("gatepassMap", gatepassMap);
return SUCCESS;
}
else{
GatepassDTO tempDTO=new GatepassDTO();
copyProperty(tempDTO,gatepassDTO);
/*HashMap<String,GatepassDTO> maps=null;
if(gatepassNo.equals("1")){
maps=new HashMap<String, GatepassDTO>();
local.saveMap(getRequest().getSession().getId(),maps);
}
maps=local.loadMap(getRequest().getSession().getId());
maps.put(gatepassNo, tempDTO);*/
putCachedObject("SINGLEGATEPASSCACHE", gatepassNo, tempDTO);
gatepassMap.put(gatepassNo, tempDTO);
//local.saveMap(getRequest().getSession().getId(),maps);
session.put("documentType", documentType);
session.put("gatepassMap", gatepassMap);
}
GatepassDTO futureDTO=new GatepassDTO();
copyProperty(futureDTO,gatepassDTO);
DocumentDTO documentDTO =futureDTO.getDocumentDTO();
List<GatepassGoodsDTO> goodsList=documentDTO.getGatepassGoodsList();
int i=0;
for(GatepassGoodsDTO goodsDTO:goodsList){
if(goodsDTO.getRemovalType()!=null&&(goodsDTO.getRemovalType().equals("Quantity")||goodsDTO.getRemovalType().equals("Weight"))){
goodsDTO.setPrevRemovalType(goodsDTO.getRemovalType());
goodsDTO.setPrevGPQuantity((goodsDTO.getRemovalQuantity()!=null?goodsDTO.getRemovalQuantity():0));
goodsDTO.setPrevGPWeight((goodsDTO.getRemovalWeight()!=null?goodsDTO.getRemovalWeight():0));
goodsDTO.setBalanceQuantity(goodsDTO.getBalanceQuantity()-goodsDTO.getRemovalQuantity());
goodsDTO.setBalanceWeight(goodsDTO.getBalanceWeight()-goodsDTO.getRemovalWeight());
goodsDTO.getVehicleDetailsList().clear();
goodsDTO.setVehicleDetailsList(goodsDTO.getDeletedVehicleDetailsList());
goodsDTO.setDeletedVehicleDetailsList(new ArrayList<GatepassVehicleDTO>());
goodsDTO.setRemovalType("");
goodsDTO.setRemovalQuantity(0);
goodsList.set(i, goodsDTO);}
else{
goodsList.set(i, goodsDTO);
}
i++;
}
documentDTO.setGatepassGoodsList(goodsList);
documentDTO.setContainerList(deletedContainerModel);
futureDTO.setDocumentDTO(documentDTO);
futureDTO.setTruckModel(new ArrayList<GatepassTruckDTO>());
session.put("gatepassDTO",futureDTO);
// setDocumentModel(null);
// setGridModel(null);
deletedVehicleModel.clear();
deletedContainerModel.clear();
// manifestNo=null;
} catch (Exception e) {
log.info(e.getMessage());
}
log.info("---------------Ending method addOnemoreGatepass----------------");
return SUCCESS;
}
private void copyProperty(GatepassDTO tempDTO,GatepassDTO gatepassDTO){`enter code here`
tempDTO.setDocumentDTO(gatepassDTO.getDocumentDTO());
tempDTO.setTruckNo(gatepassDTO.getTruckNo());
}
爲什麼會出現此問題? 這是Java核心問題還是Struts2 JSON問題?
問題是什麼?你的意思是,如果你改變了futureDTO的「DocumentDTO」,它也會影響會話中的對象? – mael
是的?如果IAM改變未來的dtoDocument數據集,它也會改變Hasmap包含tempDTO.I在覈心Java中嘗試同樣的事情,它會正常工作,但在我的項目 – user1965582