Не работает цикл, перебирающий список сессий

Рейтинг: 0Ответов: 1Опубликовано: 12.04.2023
ArrayList<Product> cartCount = new ArrayList<>();

        HttpSession session = request.getSession();
        Product product = (Product) session.getAttribute("cart");
        session.setMaxInactiveInterval(-1);

        HttpSession session1 = request.getSession();
        Product product1 = (Product) session1.getAttribute("cart1");
        session1.setMaxInactiveInterval(-1);

        if (product == null && product1 == null) {
            product = new Product(name, price, item_size, quantity, img, color);
            session.setAttribute("cart", product);
            cartCount.add(product);
            System.out.println("Товар1 в корзине");
        } else if (product1 == null) {
            product1 = new Product(name, price, item_size, quantity, img, color);
            //здесь остановка программы
            for (Product s : cartCount) {
                if (!product1.equals(s)) {
                    session1.setAttribute("cart1", product1);
                    cartCount.add(product1);
                    System.out.println("Товар2 в корзине");
                }
            }
        }
        return "redirect:/basket";
    }

Не добавляется атрибут сессии в цикле foreach. В чем может быть причина? Подскажите, пожалуйста. Product представляет из себя сущность БД с get и set методами

Ответы

▲ 0Принят

У вас создан пустой список cartCount, в который ничего не было добавлено, и после проверки условия if (product1 == null) создаётся и присваивается переменная product1. Итерация по пустому списку сразу же завершается.

Скорее всего у вас подразумевается, что в списке каким-то образом должен оказаться товар product, но возникает сомнение, что этот локальный список так уж необходим. Также непонятно, зачем создаётся синоним для сессии session1, вполне хватило бы одной переменной.

Вариант исправленного кода:

HttpSession session = request.getSession();
Product product  = (Product) session.getAttribute("cart");
Product product1 = (Product) session.getAttribute("cart1");
session.setMaxInactiveInterval(-1);

if (product == null && product1 == null) { 
    // оба товара отсутствуют, создаётся первый
    product = new Product(name, price, item_size, quantity, img, color);
    session.setAttribute("cart", product);
    System.out.println("Товар1 в корзине");
} else if (product1 == null) {
    // в корзине есть первый товар, отсутствует только второй товар
    product1 = new Product(name, price, item_size, quantity, img, color); 
    if (!product1.equals(product)) {
        // добавили в корзину второй товар, если он отличается от первого
        session.setAttribute("cart1", product1);
        System.out.println("Товар2 в корзине");
    }
}
return "redirect:/basket";

Если нужно обеспечить уникальность товаров, можно использовать Set вместо List, в частности метод Set:add возвращает true, если множество было изменено, то есть при обнаружении дубликата будет возвращаться false:

HttpSession session = request.getSession();
session.setMaxInactiveInterval(-1);

Set<Product> cart = new LinkedHashSet<>();
List<String> attribs = Arrays.asList("cart", "cart1", "cart2"); // и т.д.

for (String attr : attribs) {
    Product product = (Product) session.getAttribute(attr);
    if (null == product) {
        product = new Product(name, price, item_size, quantity, img, color);
    }
    if (cart.add(product)) { // товар успешно добавлен, нет дубликата
        session.setAttribute(attr, product);
        System.out.println("Товар " + product.getName() + " в корзине");
    }    
}

return "redirect:/basket";