Как написать собственный конвертер в Spring Web Flow 2? - PullRequest
1 голос
/ 24 апреля 2009

Я использую Web Flow 2.0.7 с Spring MVC и Hibernate.

Моя проблема связана с пользовательскими конвертерами для моих пользовательских типов и подключением к базе данных из моего конвертера.

Допустим, у меня есть тип Персона , а у Персона есть поле моего пользовательского типа Заголовок , и все Заголовки являются уже в моей базе данных. Теперь у меня есть HTML-форма, в которой пользователь может заполнить экземпляр Person , включая выбор Title в раскрывающемся списке выбора.

В определении потока я получаю все Заголовки из базы данных, и они отображаются в раскрывающемся списке с помощью пользовательского преобразователя, преобразуя Заголовок в Строка и позже вернемся к Заголовок .

Мой вопрос касается процесса преобразования обратно из String (который является идентификатором базы данных, который я установил в качестве значения для элемента) в правильный Title объект из моей базы данных , В основном: как это сделать?

Пока что мне не удалось вставить titleManager в мой конвертер, чтобы получить доступ к базе данных. Этот сценарий был прокомментирован на Spring Web Flow Forum . Другим решением может быть кэширование заголовков перед рендерингом представления и каким-то образом получить в памяти заголовок после того, как форма была отправлена.

Я был бы очень признателен, если бы кто-то мог просветить меня, как справиться с такого рода связыванием данных. Мне не удалось заставить его работать до сих пор, и, таким образом, я получаю минимальное использование от других потрясающих веб-потоков.

Я уже разместил ветку на Web Flow Board , но все еще не найден лучший способ, который я не могу найти самостоятельно.

Спасибо большое!

Вольфрам

Ответы [ 2 ]

1 голос
/ 23 июля 2009

Я использую для этого. В основном я загружаю список заголовков и помещаю его в мою модель формы. В модели формы у меня также есть переменная currentTitleId или selectedTitleId для хранения значения выбранного элемента. Это имя поля задается в «пути» выпадающего списка, а titleList - в «элементах». Затем значение, которое вы хотите связать, задается в «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>
0 голосов
/ 24 апреля 2009

Я не совсем уверен насчет Spring Web Flow, но с обычным Spring MVC достаточно зарегистрировать новый PropertyEditor, и тогда этот материал работает автоматически

http://static.springframework.org/spring/docs/2.5.x/reference/validation.html#beans-beans-conversion-customeditor-registration

http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-webdatabinder

Итак, я бы создал новый PropertyEditor, который получит сервис или дао, который будет отвечать за получение данных из базы данных, а внутри PropertyEditor вы конвертируете id в ваш тип ключа, получите значение из базы данных и вернете Это. У меня просто нет примера со мной, но я надеюсь, что вы понимаете суть.

...