【发布时间】:2014-06-24 23:40:55
【问题描述】:
在下面的 Spring 表单中,我的对象的 ID 字段被填充,但是当我在控制器方法中收到提交时,除了 ID 字段之外,所有表单的字段都被填充。我已经检查了字段类型和 getter/setter 类型都是相同的非原始类型,因为我在 SO 上看到了许多与此类似的其他问题,这似乎是常见问题。控制器没有任何方法级别的@ModelAttributes,因此它不会被填充。
这是 POST 方法的声明,我在第一行调试它,发现表单的 id 字段为空:
@RequestMapping(value="/{orgId}", method=RequestMethod.POST)
public String editOrganizationPost(@PathVariable int orgId,
@Valid @ModelAttribute(ORG_FORM) OrganizationForm orgForm,
BindingResult result, RedirectAttributes att,
HttpServletRequest request) {
这是表单对象:
public class OrganizationForm {
private Integer id;
@NotBlank
private String name;
@NotBlank
private String description;
private Set<User> users;
int moveToOrganizationId = 0;
String moveToOrganizationName;
int[] moveFromOrganizationUserSelect = null; // List of selected users
// to be moved to a new
// organization
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public int getMoveToOrganizationId() {
return this.moveToOrganizationId;
}
public void setMoveToOrganizationId(int moveToOrganizationId) {
this.moveToOrganizationId = moveToOrganizationId;
}
public String getMoveToOrganizationName() {
return this.moveToOrganizationName;
}
public void setMoveToOrganizationName(String moveToOrganizationName) {
this.moveToOrganizationName = moveToOrganizationName;
}
public int[] getMoveFromOrganizationUserSelect() {
return this.moveFromOrganizationUserSelect;
}
public void setMoveFromOrganizationUserSelect(
int[] moveFromOrganizationUserSelect) {
this.moveFromOrganizationUserSelect = moveFromOrganizationUserSelect;
}
public boolean isNew() {
return this.id == null || this.id == 0;
}
}
这是来自 JSP 文件的标记:
<form:form method="post" action="${submitUrl}" commandName="organizationForm">
<form:errors path="*" />
<form:hidden path="id" />
<table class="adminTable editContent">
<tr class="bg_lgtGrey">
<td><fmt:message
key="manageOrganizations.organizationForm.name" />:</td>
<td><form:input path="name" cssClass="inputbox"
tabindex="4" /></td>
</tr>
<tr class="bg_lgtGrey">
<td><fmt:message
key="manageOrganizations.organizationForm.description" />:</td>
<td><form:textarea path="description"
cssClass="inputbox" tabindex="4" /></td>
</tr>
<tr>
<td colspan="2" align="right"><c:choose>
<c:when test="${!organizationForm.new}">
<input type="submit" class="btn btn-primary"
id="submit_button" value="Update" />
</c:when>
<c:otherwise>
<input type="submit" class="btn btn-primary"
id="submit_button" value="Create" />
</c:otherwise>
</c:choose></td>
</tr>
</table>
</form:form>
这是生成的 HTML:
<form id="organizationForm" action="/admin/organizations/1" method="post">
<input id="id" name="id" type="hidden" value="1">
<table class="adminTable editContent">
<tbody><tr class="bg_lgtGrey">
<td>Organization Name:</td>
<td><input id="name" name="name" class="inputbox" tabindex="4" type="text" value="Organization1"></td>
</tr>
<tr class="bg_lgtGrey">
<td>Organization Description:</td>
<td><textarea id="description" name="description" class="inputbox" tabindex="4"></textarea></td>
</tr>
<tr>
<td colspan="2" align="right">
<input type="submit" class="btn btn-primary" id="submit_button" value="Update">
</td>
</tr>
</tbody></table>
</form>
我使用 Chrome devtools 来捕获 POST 数据,结果如下:
id=1&name=Organization1&description=
...然而在 editOrganizationPost 方法的第一行的断点处,form.id 字段设置为 0。
我一直在试图弄清楚为什么它会在发送时绑定名称和描述而不是 ID。我显然可以从路径变量中注入 ID,但我对它为什么不能自然地填充该字段感到目瞪口呆。
【问题讨论】:
-
您不需要使用非原始包装器来让 Spring 工作。这只是使值 可能 为空。无论如何,您可以使用您的浏览器调试工具(Chrome 的开发工具、FireFox 的 FireBug、IE 开发工具)来检查您的浏览器发布的内容吗?我只是想确保它实际上发布了 id 字段。另外,是否可以在渲染之前看到 .jsp 表单?我特别想看看你是如何对输入进行编码的(JSTL spring 标签等)。
-
我已编辑帖子以包含 JSP 表单和 POST 数据。
-
不确定它是否能解决问题,但我对框架的经验告诉我总是在类之后命名方法参数,例如
OrganizationForm organizationForm而不是OrganizationForm orgForm。 -
ORG_FORM 常量作为@ModelAttribute annotations = "organizationForm" 的值,与
-
你有什么奇怪的
@InitBinders 设置吗?
标签: java forms spring spring-mvc