Как мне написать пользовательский конвертер в Spring Web Flow 2?
-
13-09-2019 - |
Вопрос
Я использую Web Flow 2.0.7 с Spring MVC и Hibernate.
Моя проблема связана с пользовательскими преобразователями для моих пользовательских типов и подключением к базе данных из моего конвертера.
Допустим, у меня есть типаж Человек и тот Человек имеет поле моего пользовательского типа Название, и все Названия уже есть в моей базе данных.Теперь у меня есть html-форма, в которой пользователь может заполнить Человек экземпляр, включая выбор Название в раскрывающемся списке выбрать.
В определении потока я получаю все Названия из базы данных, и они отображаются в выпадающем списке с использованием пользовательского конвертера, преобразующего Название Для Строка а позже вернемся к Название.
Мой вопрос касается процесса обратного преобразования из Строка (который является идентификатором базы данных, который я устанавливаю в качестве значения для элемента) в правильное Название объект из моей базы данных.В основном:Как это сделать?
До сих пор мне не удалось внедрить titleManager в мой конвертер, чтобы получить доступ к базе данных.Этот сценарий был прокомментирован в Весенний Форум веб-потока.Другим решением могло бы быть кэширование Названия перед рендерингом представления и каким-то образом получить в памяти Название после того, как форма была опубликована.
Я был бы очень признателен, если бы кто-нибудь мог просветить меня, как обращаться с такого рода привязкой данных.До сих пор мне не удавалось заставить его работать, и, таким образом, я получаю минимальное использование от в остальном потрясающих webflows.
Я уже опубликовал поток на плате Web Flow Board, но все еще не хватает лучшей практики, которую я не могу найти сам.
Большое вам спасибо!
Вольфрам
Решение
Я использую для этого.По сути, я загружаю список заголовков и помещаю его в свою модель формы.В модели формы у меня также есть переменная currentTitleId или selectedTitleId для хранения значения выбранного элемента.Имя этого поля задается в поле "путь" выпадающего списка spring, а список заголовков - в поле "элементы".Затем значение, которое вы хотите привязать, задается в поле "itemValue", а текст, который будет отображаться для этого значения в поле "itemLabel".Вот и все.
В моей модели формы:
private int currentTitleId;
public long getCurrentTitleId() { return this.currentTitleId; }
public void setCurrentTitleId(long currentTitleId) { this.currentTitleId = currentTitleId; }
List titleList = getTitlesFromMyDatabaseHereOrSomewhereElse();
В моем jsp:
<form:label path="currentTitleId">Title</form:label>
<form:select path="currentTitleId" items="${formModel.titleList}" itemLabel="titleDescription" itemValue="titleId" />
Я предполагаю, что ваш класс Title будет чем-то вроде этого:
class Title {
public long getTitleId() { return this.titleId; }
public long getTitleDescription() { return this.titleDescription; }
}
Вы также можете настроить свой выпадающий список немного более подобным образом:
<form:select path="currentPhoneNumberId">
<form:option value="">-</form:option>
<c:forEach items="${formModel.phoneList}" var="phone">
<form:option value="${phone.phoneNumberId}">${phone.phoneNumberId} - ${phone.description}</form:option>
</c:forEach>
</form:select>
Другие советы
Я не очень уверен в Spring Web Flow, но с обычным Spring MVC достаточно зарегистрировать новый PropertyEditor, и тогда этот материал заработает автоматически
http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-webdatabinder
Итак, я бы создал новый PropertyEditor, который получает сервис или dao, который отвечал бы за получение данных из базы данных, и в PropertyEditor вы бы преобразовали идентификатор в свой тип ключа и получили значение из базы данных и вернули его.У меня просто нет с собой подходящего примера, но я надеюсь, вы уловили суть.