我正在尝试以表单的形式提交整个表,以便用户可以一次请求多个更新。
已经讨论了很多次了。 This is one of the best examples。 And this详细介绍了@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);
当我按下“提交”按钮将表格发回时,就会出现问题。
原始POST是:
DispatcherServlet-POST“ / updateProvider”,参数= {content [0] .enabled:[Y],content [0] .serviceType:[MESSAGING],content [0] .serviceInstance:[Q10],content {{ 3}}。启用:[Y],内容1。serviceType:[MESSAGING],内容1。serviceInstance:[Q10],内容1。启用:[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上调用null构造函数。但是它没有调用任何setter。我对setEnabled并不抱有希望,甚至没有任何意义。 addContent似乎更有希望,但实际上我只是添加了这些内容,以查看是否可以找到ModelAttribute想要的内容。但是我不知道如何告诉Spring进行映射。