Я пытаюсь отобразить поле коллекции объектов моей команды в списке. Внутри указанной коллекции находится поле, идентификатор и имя. Я хочу использовать идентификатор в качестве значения параметра HTML и имя в качестве текста параметра. Смотрите код ниже;
<form:select id="customCollection" path="customCollection" size="10">
<form:options items="${command.customCollection}" itemValue="id" itemLabel="name"/>
</form:select>
Имя печатается нормально, но значение остается пустым. Вот вывод HTML;
<option selected="selected" value="">name-value</option>
Сначала я предполагал, что мои данные неверны, но после размещения на моей странице следующего кода:
<c:forEach items="${command.customCollection}" var="c">
${c.id} : ${c.name} <br>
</c:forEach>
Идентификатор и имя правильно распечатаны. Таким образом, мои данные правильно доставляются на мой взгляд. Это заставляет меня предположить, что я либо использую форму: параметры неправильно, либо пытаюсь исправить ошибку в форме: параметры.
Может кто-нибудь помочь мне здесь?
EDIT:
Благодаря помощи BacMan и delfuego я смог сузить эту проблему до своего переплета.
Ранее я присваивал значение в своем элементе имени строки, вот мой начальный переплет;
binder.registerCustomEditor(Collection.class, "customCollection",
new CustomCollectionEditor(Collection.class) {
@Override
protected Object convertElement(Object element) {
String name = null;
if (element instanceof String) {
name = (String) element;
}
return name != null ? dao.findCustomByName(name) : null;
}
});
Когда я удаляю этот код из моего метода initBinder, значение строки правильно вставляется в форму, но мне нужен customEditor для преобразования указанного значения в объект базы данных.
Так что это моя новая попытка связующего;
binder.registerCustomEditor(Collection.class, "customCollection",
new CustomCollectionEditor(Collection.class) {
@Override
protected Object convertElement(Object element) {
Integer id = null;
if (element instanceof Integer) {
id = (Integer) element;
}
return id != null ? dao.find(Custom.class, id) : null;
}
});
Однако это приводит к тому же поведению, что и предыдущий переплет, и делает значение не отображаемым. Есть идеи о том, что я здесь делаю неправильно?
РЕДАКТИРОВАТЬ 2:
Как я уже упоминал выше, если я закомментирую свой пользовательский механизм связывания, тогда объект Custom действительно правильно загружает его идентификатор и имя для части представления формы, но затем никогда не связывается с родительским объектом, когда я пытаюсь его сохранить. Так что я действительно думаю, что проблема с моим переплетом.
Я разместил отладочные операторы внутри моего метода convertElement. Все выглядит так, как будто все должно работать, дао правильно извлекает объекты из базы данных. Единственное поведение, которое вызывает у меня подозрение, это то, что метод convertElement вызывается дважды для каждого элемента Custom.