Я пытаюсь отправить всю таблицу в форме, чтобы пользователь мог запросить несколько обновлений одновременно.
Это было рассмотрено довольно много раз. Это один из лучших примеров . И это входит в большую и интересную деталь о @ModelAttribute.
Однако моя проблема очень раздражает. Таблица начинает свою жизнь как визуализация Thymeleaf объекта страницы данных Spring. Я совершенно уверен, что проблема в @ModelAttribute
не совпадает с именами полей. Но через несколько часов у меня заканчиваются идеи, чтобы попробовать.
Моя форма:
<form action="#" th:action="@{/updateProvider}" th:object="${providerPage}" method="post">
<table >
<thead>
<tr>
<th th:text="#{msg.enabled}" />
<th th:text="#{msg.type}" />
...
</tr>
</thead>
<tbody>
<tr th:each="restProvider, i : ${providerPage.content}" >
<td th:style="'text-align: center;'" /> <input type="text" th:field="*{content[__${i.index}__].enabled}" />
<td th:text="${restProvider.type}" />
<td/> <input type="text" th:field="*{content[__${i.index}__].serviceType}" />
...
</tr>
</tbody>
</table>
<input type="submit" value="Update" />
Страница поставщика
является org.springframework.data.domain.Page . Он добавлен в модель и отображает все это отлично работает.
Page<RestProvider> providerPage = providerService.findPaginated(PageRequest.of(currentPage - 1, pageSize));
model.addAttribute("providerPage", providerPage);
Проблема возникает, когда я нажимаю кнопку отправки, чтобы отправить таблицу обратно.
Исходный пост:
DispatcherServlet - POST "/ updateProvider", параметры = {content [0] .enabled: [Y], content [0] .serviceType: [MESSAGING], content [0] .serviceInstance: [Q10], content 1 .enabled: [Y], содержимое 1 .serviceType: [MESSAGING], содержимое 1 .serviceInstance: [Q10], содержимое 2 .enabled: [Y], содержимое 2 .serviceType: [MESSAGING], содержимое 2 .serviceInstance: [Q10]}
Я пробовал МНОГИЕ подписи контроллера, но я все еще считаю, что это самое близкое к праву:
@RequestMapping(value = "/updateProvider", method = RequestMethod.POST)
public String updateProvider(@ModelAttribute("content") RestProviderList providers) {
RestProviderList - это:
public class RestProviderList {
private List<RestProvider> restProviders;
public RestProviderList() {
this.restProviders = new ArrayList<RestProvider>();
}
public List<RestProvider> getRestProviders() {
return restProviders;
}
public void setRestProviders(List<RestProvider> restProviders) {
this.restProviders = restProviders;
}
public void addContent(RestProvider restProvider) {
this.restProviders.add(restProvider);
}
public void setEnabled(String enabled) {
logger.debug("Enabled:{}", enabled);
}
RestProvider - это модель Spring JPA. Кажется бессмысленным загромождать пост этим. Я просто добавлю, что все сопоставления работают вне исходных данных, поэтому таблица является точным представлением своих методов получения / установки.
@ ModelAttribute покорно вызывает нулевой конструктор в RestProvidersList. Но это не вызывает никаких сеттеров. Я не надеялся на setEnabled, это даже не имеет смысла. addContent казался немного более многообещающим, но на самом деле я просто добавил их, чтобы посмотреть, смогу ли я выяснить, что ищет ModelAttribute. Но я не могу понять, как сказать Spring, чтобы сделать отображение.