public class CustomerDTO {
private int customerId;
private String customerName;
private String customerAddress;
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerAddress() {
return customerAddress;
}
public void setCustomerAddress(String customerAddress) {
this.customerAddress = customerAddress;
}
}
класс CustomerDAO:Добавление объектов (копируется через оборонительный копирования с использованием BeanUtils) в ArrayList давая затхлый данные: Spring 3
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public final class CustomerDAO {
private CustomerDTO customer;
public void setCustomer(CustomerDTO customer) {
this.customer = customer;
}
//Trying to get copy of object with BeanUtils
public final CustomerDTO getCustomer(int customerId){
CustomerDTO origCustomer = _springContext.getBean(CustomerDTO.class);
CustomerDTO targetCustomer=null;
if("you get customer based on customer id") then "targetCustomer got initialized";
BeanUtils.copyProperties(targetCustomer, origCustomer);//spring BeanUtils
}
//Trying to add object returned by above method into the list
public final List<CustomerDTO> getCustomerList(List<Integer> customerIds){
List<CustomerDTO> customerList = new ArrayList<CustomerDTO>();
for(Integer id:customerIds){
CustomerDTO customer = getCustomer(id);
System.out.println("correct output: "+customer.getCustomerId());//getting correct output here
customerList.add(customer);//Trying to add copied object in list
}
for(CustomerDTO customer: customerList){
System.out.println("wrong output: "+customer.getCustomerId());//getting wrong output here
}
return Collections.unmodifiableList(customerList);
}
}
В CustomerDTO getCustomer(int customerId)
метод, я пытаюсь вернуть копию объекта CustomerDTO с помощью Spring BeanUtils.copyProperties(targetCustomer, origCustomer);
. Но когда я добавляю эти скопированные объекты в список в методе List<CustomerDTO> getCustomerList(List<Integer> customerIds)
, то я получаю странное поведение, как упоминалось в комментариях. Если я удалю BeanUtils.copyProperties(targetCustomer, origCustomer);
, поведение будет правильным.
Тестовый пример:
getCustomerList with customerIds =[1,2,3,4]
С скопированных объектов: BeanUtils.copyProperties(targetCustomer, origCustomer);
// пружинные BeanUtils
correct output: 1
correct output: 2
correct output: 3
correct output: 4
wrong output: 4
wrong output: 4
wrong output: 4
wrong output: 4
Без скопированных объектов:BeanUtils.copyProperties(targetCustomer, origCustomer);
// пружинные BeanUtils
correct output: 1
correct output: 2
correct output: 3
correct output: 4
wrong output: 1
wrong output: 2
wrong output: 3
wrong output: 4
Может кто-нибудь, пожалуйста, объясните мне, что является неправильным или возможным объяснением этого поведения?
Обновлено: Цель использования BeanUtils:
Я пытаюсь использовать защитную копию изменяемого объекта перед возвратом объекта CustomerDTO от метода getCustomer()
. Поэтому я пытаюсь использовать мелкое клонирование после this post.
обновление: Убрано слово «неизменность», поскольку это было неправильно использовать.
Будет интересно посмотреть, как вы инициализации ваш targetCustomer прежде чем перейти к BeanUtils. Я предполагаю, что вы возвращаете targetCustomer из метода getCustomer (int). При любом изменении вы каждый раз возвращаете «тот же» экземпляр целевого клиента. – Optional
Где непреложный объект? Я не вижу никаких конечных переменных. – tom
@Optional: я извлекаю данные из базы данных для инициализации targetCustomer перед тем, как перейти к Bean Utils. – ritesh