JSF не сохраняет оригинальный Список и не смешивает измененный и оригинальный Список ИЛИ Как сделать глубокую копию ArrayList в JSF 2.0 ModelBean - PullRequest
0 голосов
/ 23 октября 2011

Я использую JSF2.0 в своем приложении.Бизнес-требования в моем проекте таковы, что при загрузке страницы отображается список.Список поступает из уровня DAO или уровня веб-службы.Позволяет назвать этот оригинальный список.Теперь у нас есть 2 списка, копии друг друга, в которых только исходный список, а другой ограничен JSF

Теперь список является редактируемым списком, поэтому я использую a для отображения списка и каждой ячейки вэтоТеперь при нажатии кнопки СОХРАНИТЬ измененный список пользователем (так как список редактируемый) сравнивается с исходным списком.Только если два списка отличаются, измененный список отправляется обратно в веб-сервис.Проблема и проблема, с которой я сталкиваюсь, заключается в том, что в первой строке самого метода save () как исходный, так и измененный список точно совпадают и указывают только на измененный список.Поэтому я не могу сравнить 2 списка.

Моя реализация выглядит следующим образом:

PhaseListener вызывает метод ниже при загрузке страницы

 public String populateDataTable() {

        this.orderList = new ArrayList<ItemOrder>();
        this.originalOrderList = new ArrayList<ItemOrder>();
        MockWebService mockService = new MockWebService();
        this.setOrderList(mockService.mockWSMethod());
        this.originalOrderList = this.getOrderList();//i know this is where i am doing something wrong. i need to deep copy a list. but for this i cannot make an additional web service call and call that web service again and store the list in originalOrderList
        return "view";
    }

При нажатии кнопки сохранения

    public String saveAction() {
        boolean isSame = true; // true if same and false if different
        for (int i = 0; i < this.originalOrderList.size(); i++) {
            if (!this.originalOrderList.get(i).equals(this.orderList.get(i))) {
                isSame = false;
            }
        }
//however both originalOrderList and orderList have the same modified List.
        if (isSame == true) {
            System.out.println("Same lists");
        } else {
            System.out.println("Different lists");
        }
        return "default";
    }

Пожалуйста, помогите мне.

Заранее спасибо, Киран

1 Ответ

0 голосов
/ 23 октября 2011

Как вы упомянули, проблема, с которой вы сталкиваетесь, заключается в том, что originalOrderList является поверхностной копией orderList (при условии, что getOrderList () возвращает ссылку orderList). В вашем случае и orderList, и originalOrderList являются ссылками, указывающими на один и тот же объект ArrayList, и, если вносится изменение в значение вашего orderList, то originalOrderList отражает это изменение, поскольку оно имеет одну и ту же ссылку.

Решение состоит в том, чтобы сделать глубокую копию вашего originalOrderList:

this.originalOrderList = this.getOrderList().clone(); 

если ваш ItemOrder является неизменным объектом, в противном случае:

public static List<ItemOrder> cloneList(List<ItemOrder> list) {
    List<ItemOrder> clone = new ArrayList<ItemOrder>(list.size());
    for(ItemOrderitem: list) clone.add(item.clone());
    return clone;
}

и вам потребуется получить объект ItemOrder для реализации интерфейса Cloneable и реализации метода clone ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...