Java Spring - Thymeleaf возвращает нулевой объект контроллеру

У меня есть страница, которая содержит информацию о результатах калькулятора в базе данных. Когда я пытаюсь нажать кнопку на следующей странице, если я проверю более подробную информацию, то исключение java catch:

The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!

Почему у меня эта ошибка?

Мои контроллеры:

@GetMapping("/form")  
    public String selectData(Model model){  
        model.addAttribute("calcResults", calculatorRepository.findAll());
        return "user/form";  
    } 

-

@PostMapping("/show")
public String showDetails(@ModelAttribute(value = "calcResults") CalculatorResult calcResults,Model model){
    System.out.println(calcResults.getId());
    model.addAttribute("calcResults", calculatorRepository.findOne(calcResults.getId()));
    return "user/show";
} 

-

<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html xmlns = "http://www.w3.org/1999/xhtml" 
      xmlns:th = "http://www.thymeleaf.org">
    <head>
        <link rel = "stylesheet" href = "style.css" type = "text/css"/>
        <script
  src = "https://code.jquery.com/jquery-3.3.1.min.js"
  ></script>
        <script src = "https://cdnjs.cloudflare.com/ajax/libs/printThis/1.12.3/printThis.js"></script>

        <title>Result</title>
        <meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
        <link type = "text/css" rel = "stylesheet" th:href = "@{css/bootstrap.min.css}" />
        <link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
        <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

    </head>
    <body>
            <form action = "#" th:action = "@{/show}" th:object = "${calcResults}" method = "post">
            <div class = "col-md-4">
        <h1>Historia</h1>
            </div>

            <div style = "padding:0 20px"/>

                <table class = "table table-striped">
                        <tr>
                            <th>ID</th>
                            <th>Data Wyjazdu</th>
                            <th>Data Przyjazdu</th>
                            <th>Akcja</th>
                        </tr>  
                <tr th:each = "calc : ${calcResults}">
                        <td th:text = "${calc.id}"></td>
                        <td th:text = "${#dates.format(calc.dataWyjazdu, 'dd-MM-yyyy')}"></td>
                        <td th:text = "${#dates.format(calc.dataPrzyjazdu, 'dd-MM-yyyy')}"></td>

                        <td>
                            <button type = "submit" class = "btn btn-success btn-xs">Przelicz</button>
                            <!--<a th:href = "@{/sucess}" class = "btn btn-success btn-xs">Szczegóły</a>-->
                        </td>
                </tr>
            </table>
            </form>
    </body>
</html>
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
789
1

Ответы 1

Ваша привязка неверна. Вам не хватает двух вещей:

  1. Используйте атрибут th: field вместо атрибута th: text. Вот почему id не привязан к соответствующему объекту.
  2. Похоже, что объект привязки к «calcResults» представляет собой список объектов. Я никогда не заставлял это работать таким образом. Я думаю, что динамическое связывание вообще не работает. Обходной путь: создайте класс-оболочку CalcResult, у которого есть свойство-массив, например названные элементы (заменяющие ваш список) ... + следующий код:

    <tr th:each = "calc, stat : *{items}">
      <input type = "text"
         th:field = "*{items[__${stat.index}__].id}">
      /* other fields of the objects stored in the array has to be insert here like in the line above */
    </tr>
    

Другие вопросы по теме