0

Помогите разобраться, всю голову уже сломал: делают веб-магазин, нужно сделать метод изменения статуса заказа. Идет работа с бд 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) ...

Byb
  • 2,318
Alex
  • 11

1 Answers1

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

&lt;hr&gt;

</div>

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

Alex
  • 11