#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">
, что выдаст ту же ошибку, но этого не произошло.