с вашим контроллером все в порядке, вы отображаете запрос post на "/" и ожидаете получить объект MessageThread, который должен быть построен из содержимого запроса, проблема в шаблоне: вы не отправляете данные в запросе от клиента к серверу, поэтому у Spring нет способа присвоить правильные значения новому экземпляру MessageThread.
Если мы возьмем этот блок из вашего шаблона:
<th:block th:each="thread : ${threads}">
<td th:type="id"><span th:text="${thread.getId()}"></span></td>
<td><span th:text="${thread.getHeader()}"> Title </span></td>
<td><span th:text="${thread.getText()}"> Title </span></td>
<form th:object="${thread}" th:method="post">
<td><button name="inThread" type="submit">В тред</button></td>
</form>
</th:block>
1) В теге формы отсутствует атрибут action, попробуйте добавить что-то вроде th:action="@{/}"
для нацеливания сопоставления вашего запроса на стороне сервера.
2) Вы не отправляете фактическое содержимое объекта потока на сервер, для этого вы должны добавить входные теги с именем импута, совпадающим с именем поля в объекте MessageThread, который вы хотите заполнить. Примерно так:
<input type="hidden" th:field="*{header}" />
<input type="hidden" th:field="*{text}" />
В этом примере th:field
создает атрибуты name
и value
для входных тегов, поэтому вам не нужно делать это вручную.
Подводя итог, невозможно передать фактический "экземпляр" объекта из html, запущенного на клиенте, в приложение java, запущенное на сервере, вы можете отправлять данные только по HTTP и анализировать, что данные на сервере. Аннотация ModelAttribute
инструктирует Spring проверять объект (в данном случае MessageThread
) и находить в данных, отправляемых через запрос, соответствующие значения для заполнения объекта.
Надеюсь, это поможет.