Ваш контроллер ожидает объект Movie, но он получает что-то еще, что затем создает нулевой объект Movie. Вам нужно использовать th:object
в вашей форме, чтобы правильно отправить соответствующий класс. Во-первых, давайте добавим новый @ModelAttribute
в ваш контроллер, чтобы ваша форма могла автоматически отображать ваш объект Movie в вашей форме.
Контроллер
// In order to use th:object in a form, we must be able to map a new entity to that form.
// In this case we return a Movie entity.
@ModelAttribute(value = "newMovie")
public Movie newMovie() {return new Movie();}
Теперь давайте изменим вашу форму, чтобы она действительно отправляла объект Movie.
<form th:action="@{/save}" method="post" th:object="${newMovie}">
<p><input type="text" id="movie_id" th:field="*{movie_id}"/></p>
<p><input type="text" id="movie_name" th:field="*{movie_name}"/></p>
<p><input type="submit" value="save" /></p>
</form>
Обратите внимание, что я также изменил атрибут name
в ваших входах для th:field
. Помните, что для того, чтобы это работало, имя каждого поля должно точно совпадать с именами в ваших объектах.
Обновление
Если вы хотите установить значение по умолчанию для вашей формы, без использования js
и поскольку вы не можете объединить th:field
с th:value
, вы можете установить атрибут объекта в вашем контроллере.
@ModelAttribute(value = "newMovie")
public Movie newMovie() {
Movie movie = new Movie();
movie.setName("Test");
return movie;
}
Обновление 2
Если вы хотите поместить текущую итерацию списка Thymeleaf в вашу форму, вы можете сделать следующее.
<div class="container">
<table class="table table-hover">
<tr>
<th>Id</th>
<th>Name</th>
</tr>
<tr th:each="LatestMovies : ${latestMovies}">
<td th:text="${LatestMovies.id}"></td>
<td th:text="${LatestMovies.movieName}"></td>
<td>
<form th:action="@{/save}" th:object="${LatestMovies}" method="post">
<p><input type="hidden" th:value="*{id}"/></p>
<p><input type="hidden" th:value="*{movieName}"/></p>
<p><input type="submit" value="Submit"/></p>
</form>
</td>
</tr>
</table>