Обработка значения enumm(select) в форме на Java

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

Помогите разобраться, всю голову уже сломал: делают веб-магазин, нужно сделать метод изменения статуса заказа. Идет работа с бд postgres. Делаю метод, отправляющий SQL-запрос со вставкой значений из формы (из списка).

Сам список, перечисляющий значения enum, выводится, но не пойму, как обработать его в контроллере, чтобы получить значение из формы, передать в метод отправляющий запрос в базу.

Код репозитория:

@Modifying
@Query("UPDATE Order order SET order.status = ?1 WHERE order.id = ?2")
int updateOrderStatus(int status, int id);

Код сервисного класса:

@Transactional
public void updateOrderStatus(int status, int id){

    orderRepository.updateOrderStatus(status, id);

}

Код контроллера:

@PostMapping("/admin/orders/change_status/{id}")
public String updateOrderStatus(@Valid Status status, @PathVariable("id") int id, Model model){
    model.addAttribute("status", status);
    orderService.updateOrderStatus(status.ordinal(), id);
    return "redirect:/order";

}

Код HTML:

<form method="post" th:action="@{/admin/orders/change_status/{id}(id=${order.getId()})}" th:object="${status}">
    <label for="status">Выберите статус: </label>
    <select id="status">
        <option th:each="enumm : ${T(com.smaglyuk.handmadeshop.enumm.Status).values()}"
                th:text="${enumm}"
                th:value = "${enumm}">
        </option>
    </select>
    <input type="submit" value="Изменить статус">
</form>

Текст ошибки:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Tue Apr 11 00:42:09 MSK 2023
There was an unexpected error (type=Internal Server Error, status=500).
Cannot invoke "com.smaglyuk.handmadeshop.enumm.Status.ordinal()" because "status" is null
java.lang.NullPointerException: Cannot invoke "com.smaglyuk.handmadeshop.enumm.Status.ordinal()" because "status" is null
    at com.smaglyuk.handmadeshop.controllers.AdminController.updateOrderStatus(AdminController.java:204)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
...

Ответы

▲ 0Принят

Всем спасибо! Победил, методом проб и ошибок, анализом исключений. И ниже результат(лучше один раз выложить код, чем 10 раз описывать, что сделал):

Код репозитория:

@Modifying
@Query("UPDATE Order orders SET orders.status = ?1 WHERE orders.id = ?2")
int updateOrderStatus(Status status, int id);

Код сервисного класса:

@Transactional
public void updateOrderStatus(Status status, int id){
orderRepository.updateOrderStatus(status, id);
    }

Код контроллера:

@GetMapping("/admin/orders/change_status/{id}")
public String updateOrderStatus(@PathVariable("id") int id, @RequestParam("statusValue") Status status){
orderService.updateOrderStatus(status, id);
return "redirect:/admin/orders";
    }

Код HTML:

<div th:each="order : ${orders}">
    <h3 th:text="'Заказ №' + ${order.getNumber()}"></h3>
    <img th:src="'/img/' + ${order.getProduct().getImageList()[0].getFileName()}" width="300px">
    <p th:text="'Пользователь: ' + ${order.getPerson().getLogin()}">
    <p th:text="'Наименование: ' + ${order.getProduct().getTitle()}">
    <p th:text="'Количество: ' + ${order.getCount()}">
    <p th:text="'Цена: ' + ${order.getPrice()}">
    <p th:text="'Дата заказа: ' + ${#temporals.format(order.getDateTime(), 'dd-MMM-yyyy')}"></p>
    <p th:text="'Cтатус: ' + ${order.getStatus()}">

    <form method="get" th:action="@{/admin/orders/change_status/{id}(id=${order.getId()})}">
        <label for="status">Выберите статус: </label>
        <select id="status" name="statusValue">
            <option th:each="enumm : ${T(com.smaglyuk.handmadeshop.enumm.Status).values()}"
                    th:text="${enumm}"
                    th:value = "${enumm}">
            </option>
        </select>
    <input type="submit" value="Изменить статус">
    </form>

    <hr>
</div>

Ещё раз всем спасибо! Буду чаще тут бывать )))