Почему не добавляется параметр из value в сессию, с помощью кнопки?

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

Пишу интернет магазин на Spring MVC, но не получается выбрать нужный размер при нажатии на кнопку

<form th:action="/change-name" method="post">

<input type="hidden" name="img" th:value="${el.img}"/>
<input type="button" name="item_size" class="" th:value="${el.item_size}"/>
<input type="hidden" name="name" th:value="${el.name}" class="hid_name" readonly/>
<input type="number" name="price"  class="total-price" th:value="${el.price}"/>
<input type="hidden" name="color" th:value="${el.color}"/>
<input class="quantity_range" name="quantity" type="hidden" th:value="${el.quantity}">


<button type="submit">Add to cart</button>


</form>
 @PostMapping("/change-name")
    protected String doSet(HttpServletRequest request, HttpServletResponse response, @RequestParam String img, @RequestParam String name, @RequestParam Integer price, @RequestParam String item_size, @RequestParam Integer quantity, @RequestParam String color)
            throws ServletException, IOException {

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

        HttpSession session2 = request.getSession();
        Product product2 = (Product) session2.getAttribute("cart2");
        session2.setMaxInactiveInterval(-1);

        PrintWriter out = response.getWriter();

            if(product == null) {

                product = new Product(name, price, item_size, quantity, img, color);
                session.setAttribute("cart", product);
            }
            else if(product1 == null) {
                product1 = new Product(name, price, item_size, quantity, img, color);
                session1.setAttribute("cart1", product1);
            }
            else {
                product2 = new Product(name, price, item_size, quantity, img, color);
                session2.setAttribute("cart2", product2);
            }

        return "redirect:/basket";
    }

Required request parameter 'item_size' for method parameter type String is not present]

Остальные параметры передаются в сессию без проблем.

Помогите, пожалуйста, разобраться почему не добавляется параметр из value в сессию, с помощью кнопки?

Ответы

▲ 1Принят

Параметры добавляются в сессию с помощью session.setAttribute(), и хотя в спринге можно использовать @SessionAttributes для передачи атрибутов между запросами.

С бинами там попроще работать если объявить его видимость как @SessionScope. Вы несколько раз пытались получить сессию из запроса на протяжении всего метода помеченного как @PostMapping, что в свою очередь мапится на URL, указанный в скобках.

Особенность в спринге состоит в том, что не только мапится базовый адрес, но и параметры, указанные как @RequestParam, которые передаются и иньектятся в локальные переменные. Но, как мы знаем, параметры передаются в метод по значению, и значения параметров конвертируются в типы параметров.

Но тут даже дело не в том, какие типы параметров вы используете, так как ошибка не в конвертации типов.

Required request parameter 'item_size' for method parameter type String is not present]

Это означает, что параметр 'item_size' не передается вообще.

И действительно, если посмотреть на форму, то можно увидеть

<input type="button" name="item_size" class="" th:value="${el.item_size}"/>

Такая кнопка не передается с помощью параметра и не мапится в переменные запроса.

А должно быть

<input type="hidden" name="item_size" class="" th:value="${el.item_size}"/>