Не соблюдается уникальность в коллекции Set

Рейтинг: 0Ответов: 1Опубликовано: 14.04.2023

Я пишу корзину интернет-магазина. Описание проблемы: я добавляю две сессии cart и cart1, соблюдается проверка на уникальность. Но, если я удалю сессию cart и оставлю cart1, то при добавлении нового элемента уникальность не будет соблюдена. Подскажите, пожалуйста, с чем это может быть связано

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

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

        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";

Класс сущности БД Product, в котором переопределены методы:

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return name.equals(product.name) && item_size.equals(product.item_size);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, item_size);
    }
@PostMapping("/cart/remove")
    public String Cart_remove(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        session.removeAttribute("cart");
        return "redirect:/basket";
    }

Ответы

▲ 1Принят

Если проблема заключается в том, что в некотором сценарии, когда в сессии есть атрибуты cart cart1, и после удаления атрибута cart можно добавить атрибут cart со значением, равным значению атрибута cart1, оставшемуся от прошлых операций.

Решение может заключаться в том, чтобы сначала проверить и внести в сет сушествующие атрибуты, а потом уже пытаться добавлять "новые" значения.

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

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

for (String attr : attribs) {
    Product product = (Product) session.getAttribute(attr);
    if (null == product) {
        missingAttrs.add(attr);
    } else if (cart.add(product)) { // товар успешно добавлен в сет
        System.out.println("Товар " + product.getName() + " в сессии и сете");
    }
}

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

return "redirect:/basket";