최근 프로젝트에서 사용자가 버튼을 클릭 할 때 동적 격자를 생성하는 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());
}
왜이 문제가 발생합니까? 이 핵심 자바 문제 또는 Struts2 JSON 문제가 있습니까?
무엇이 문제입니까? 예를 들어, 향후 DTO의 "DocumentDTO"를 변경하면 세션의 객체에도 영향을 미칩니 까? – mael
예? iam이 미래의 dtoDocument 데이터를 변경하는 경우 Hasmap에 tempDTO가 포함되어 있습니다. 코어 자바에서 똑같은 작업을 시도했지만 프로젝트에서 제대로 작동합니다. – user1965582