Это мой первый раз с тимелистом, и я столкнулся со странной проблемой, которую, похоже, не могу обойти. Минимальный пример:
Рассмотрим следующее сопоставление контроллеров для вывода списка всех пользователей из базы данных:
@GetMapping("/users")
public String listUsers(Model model) {
model.addAttribute("users", userRepository.findAll());
return "users";
}
В представлении пользователей я хочу перечислить пользователей и для каждого из них я хочучтобы добавить кнопку для получения сведений об этом конкретном пользователе:
<table>
<thead>
<tr><th>Name</th></tr>
</thead>
<tbody>
<form th:each="user : ${users} th:action="@{/user}" th:object="${user}" method="post">
<tr>
<td th:text="${user.getUserName()}">Name</td>
<td><input type="submit" value="Details" /></td>
</tr>
</form>
</tbody>
</table>
Итак, поскольку пользователи - это список, моей первоначальной идеей было создать форму для каждого пользователя в этом списке и привязать текущий ${user} to th: object. Затем в отображении контроллера для деталей (поскольку это могло бы быть изменено за это время):
@PostMapping("/user")
public String userDetails(@ModelAttribute User user, Model model) {
model.addAttribute("user", userService.findUserById(user.getId()));
return "userDetails";
}
Теперь моя проблема в том, что он не работает. ModelAttribute является нулевым в контроллере. Я читал документацию по формам тимилиста, но не могу понять, почему я не могу опубликовать пользователя с текущей итерации без добавления всех атрибутов пользователя в скрытых полях формы. Я мог бы попытаться сделать что-то совершенно безумное, но я не знаю, честно ... Какие-нибудь советы для меня? :)
@ Обновление: после бесчисленных переписываний я согласился со следующим:
@GetMapping("/users/{id}/details")
public String user(@RequestParam Integer userId, Model model) {
model.addAttribute("user", userService.findUserById(userId));
return "userDetails";
}
То есть я хочу получить только идентификатор пользователя. Для этого я создал следующий шаблон:
<form th:each="user: ${users}" th:action="@{/users/{user_id}/details(user_id=${user.id}})}" method="post">
<tr>
<td th:text="${user.userName}">Name</td>
<td><input type="submit" value="Details" /></td>
</tr>
</form>
Теперь это приводит к
Причина: org.thymeleaf.exceptions.TemplateProcessingException: Не удалось проанализировать как выражение: "@ {/ users / {user_id} / details (user_id = $ {user.id}})} "(шаблон:" users "- строка 13, столбец 44)
Я также попробовал старыйМетод post со скрытым текстовым полем для идентификатора и использующий th: object = "$ {user.id}" в контроллере равен нулю. Я оставил объект th: для пользователя, имея единственное скрытое поле для user.id, в контроллере User is null id поле не установлено. Если я пытаюсь использовать th: field для чего-либо, я снова получаю исключение чабреца:
, вызванное: org.attoparser.ParseException: Ошибка во время выполнения процессора 'org.thymeleaf.spring5.processor. SpringInputGeneralFieldTagProcessor '(шаблон: "users" - строка 16, столбец 44)
Мое глубочайшее уважение к каждому веб-разработчику. Я всегда ненавидел все, что связано с веб-разработкой, и, честно говоря, это не хочет, чтобы мне это даже начало нравиться. Это полное безумие:)