Поле идентификатора весенней формы, не заполненное в сообщении

#java #forms #spring #spring-mvc

#java #формы #весна #весна-mvc

Вопрос:

В приведенной ниже форме Spring заполняется поле идентификатора моего объекта, но когда я получаю отправку в методе контроллера, заполняются все поля формы, кроме поля ID. Я проверил в пять раз, что типы типа поля и getter / setter являются одинаковыми, не примитивными, поскольку я видел многие другие вопросы, похожие на этот, и это, похоже, общая проблема. У контроллера нет никаких атрибутов @ModelAttributes на уровне метода, поэтому он не заполняется иначе.

Вот объявление метода POST, поскольку я отладил его в первой содержащей строке и обнаружил, что поле идентификатора формы пустое:

     @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=1amp;name=Organization1amp;description=
 

…тем не менее, в точке останова в первой строке метода editOrganizationPost form.id поле имеет значение 0.

Я потратил целую вечность, пытаясь понять, почему при отправке он будет привязывать имя и описание, но не идентификатор. Очевидно, я мог бы просто ввести идентификатор из переменной path, но я ошеломлен тем, почему он просто не заполнит поле естественным образом.

Комментарии:

1. Вам не нужно использовать непримитивные оболочки для работы Spring. Это просто делает так, чтобы значения могли быть нулевыми. В любом случае, можете ли вы использовать инструменты отладки ваших браузеров (инструменты разработчика Chrome, FireBug FireFox, инструменты разработчика IEs), чтобы проверить, что публикует ваш браузер? Я просто хочу убедиться, что оно действительно публикует поле идентификатора. Кроме того, можно ли просмотреть форму .jsp до рендеринга? Я особенно хочу посмотреть, как вы кодируете входные данные (теги JSTL spring и т. Д.).

2. Я отредактировал сообщение, чтобы включить форму JSP и данные POST.

3. Не уверен, решит ли это проблему, но мой опыт работы с фреймворком научил меня всегда называть параметр метода после класса, например OrganizationForm organizationForm , вместо OrganizationForm orgForm .

4. Константа ORG_FORM, которую я использую в качестве значения для @ModelAttribute annotations = «organizationForm», такая же, как атрибут CommandName тегов <form:form> . Не должно иметь значения, как называется переменная метода Java.

5. У вас есть какие-нибудь странные @InitBinder настройки s?

Ответ №1:

У меня была та же проблема .. поле id всегда будет иметь значение 0. Изменение поля идентификатора на что-то другое тоже не сработало. После еще одного наезда на след, удаление

disabled="true"

От

<form:input path"id" disabled="true"/>

исправлена проблема. Я предполагал <form:hidden path="id"> , что выдаст ту же ошибку, но этого не произошло.