Не соблюдается уникальность в коллекции Set
Я пишу корзину интернет-магазина. Описание проблемы: я добавляю две сессии 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";