У вас есть @Initbinder
по нескольким данным в этом же бланке?InitBinder на нескольких объектах формы
У меня есть форма пружины, которая содержит выпадающее меню объекта и два поля данных. У меня есть Initbinder в датах, иначе я получаю сообщение об ошибке при отправке. Но мне также нужно связать выпадающий список с объектом.
У меня есть тип, который имеет две даты и Category
, и это Category
Мне нужно связать, потому что он не может быть пустым при сохранении. Я думаю, что это поможет мне проверить форму. Могу ли я иметь это в контроллере Type?
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
binder.registerCustomEditor(Category.class, "category", new CategoryEditor(CategoryService));
}
И это редактор:
public class CategoryEditor extends PropertyEditorSupport {
private CategoryService categoryService;
public CategoryEditor(CategoryService categoryService) {
this.categoryService = categoryService;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text.equals("0")) {
this.setValue(null);
} else {
Category sc = categoryService.getCategory(Integer.parseInt(text));
this.setValue(sc);
}
}
@Override
public String getAsText() {
Category parent = new Category();
if (this.getValue() != null) {
parent = (Category) this.getValue();
}
return "";
}
}
И моя страница JSP-
<s:url value="/mvc/type/save" var="actionUrl" />
<sf:form method="POST" modelAttribute="type" action="${actionUrl}">
<fieldset>
<legend><s:message code="${heading}" /></legend>
<table>
<tr>
<th><label for="category"><s:message code="category" />:</label></th>
<td><sf:select path="category.ID" id="category">
<sf:option value="0"> </sf:option>
<sf:options items="${listOfCategories}" itemLabel="name" itemValue="ID" />
</sf:select></td>
</tr>
<tr>
<th><label for="name"><s:message code="name" />:</label></th>
<td><sf:input path="name" id="name" />
<sf:hidden path="ID" />
<sf:hidden path="version" /></td>
</tr>
<tr>
<th><label for="marketing"><s:message code="marketing" />:</label></th>
<td><sf:input path="marketingFunction" id="marketing" /></td>
</tr>
<tr>
<th><label for="status"><s:message code="status" />:</label></th>
<td><sf:select path="lifeCycleStatus">
<sf:option value="0"> </sf:option>
<sf:options items="${listOfEnums}" />
</sf:select></td>
</tr>
<tr>
<th><label for="validfrom"><s:message code="validfrom" />:</label></th>
<td><sf:input path="validFrom" id="validfrom" /></td>
</tr>
<tr>
<th><label for="validuntil"><s:message code="validuntil" />:</label></th>
<td><sf:input path="validUntil" d="validuntil" /></td>
</tr>
<tr>
<td colspan="2">
<input id="saveButton" class="right" type="submit" title="<s:message code="save" />" value=" [ <s:message code="save" /> ] " />
</td>
</tr>
</table>
</fieldset>
</sf:form>
Так что мой вопрос: Могу ли я иметь несколько связующего вещества в том же initBinder
в мой контроллер? Кажется, я не могу, потому что я никогда не вхожу в CategoryEditor
. Как мне это сделать?
Ahh спасибо! :) Теперь вызывается мой редактор. Но теперь выбирается последний элемент в dropdown, и если я смотрю на исходный код, все элементы в раскрывающемся списке имеют «selected = selected». Можно ли выбрать только верхний элемент? – user2018311
Ваш «CategoryEditor» испорчен. Ваш 'getAsText' всегда возвращает' '' ', тогда как вы, вероятно, должны возвращать идентификатор. –
Я думаю, что я использовал path = category.ID, потому что я использую ту же форму для редактирования Type. Если я не использую path = category.ID, эта категория не будет выбрана, когда я захочу изменить тип. Так что теперь это не работает. – user2018311