【问题标题】:Spring form ID field not populated on POSTPOST 上未填充 Spring 表单 ID 字段
【发布时间】: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" 的值,与
    标签的 commandName 属性相同。 Java 方法变量的名称不应该有所不同。
  • 你有什么奇怪的@InitBinders 设置吗?

标签: java forms spring spring-mvc


【解决方案1】:

我遇到了同样的问题.. id 字段将始终设置为 0。将 id 字段更改为其他内容也不起作用。经过更多的打击和跟踪,删除

disabled="true"

来自

&lt;form:input path"id" disabled="true"/&gt;

解决了这个问题。 我以为 &lt;form:hidden path="id"&gt; 会给出同样的错误,但它没有。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多