тимелист, отправляющий текущий объект от th: каждый - PullRequest
0 голосов
/ 16 октября 2019

Это мой первый раз с тимелистом, и я столкнулся со странной проблемой, которую, похоже, не могу обойти. Минимальный пример:

Рассмотрим следующее сопоставление контроллеров для вывода списка всех пользователей из базы данных:

@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)

Мое глубочайшее уважение к каждому веб-разработчику. Я всегда ненавидел все, что связано с веб-разработкой, и, честно говоря, это не хочет, чтобы мне это даже начало нравиться. Это полное безумие:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...