Можно ли использовать пользовательский JSF-конвертер для UISelectOne, в зависимости от значения свойства Bean или значения UIInputText? - PullRequest
1 голос
/ 02 апреля 2012

Мне нужна помощь с проблемой. У меня есть приложение, которое отображает данные из базы данных.

В базе данных я использую один столбец для идентификации объекта с изменениями во времени (версия объекта). Я имею в виду, что строки имеют разные идентификаторы, но один и тот же OBJECT_ID. Они также различаются по столбцам DATE достоверности (VALID_FROM и VALID_TO), поэтому я могу найти правильную версию объекта в выбранное время.

Когда страница показывается пользователю, он устанавливает ДАТУ для отображения данных. На странице есть форма с полями выбора (их элементы являются объектами из базы данных). Мне нужно показать только элементы, которые удовлетворяют условию действия. Все хорошо до обработки формы.

Я использую пользовательский конвертер, который преобразует значение String (идентификатор строки в таблице базы данных) в объект моей модели, но мне нужно два значения, чтобы найти строку. (ID и ДАТА из формы пользователя).

Метод преобразователя getAsObject получает только один параметр VALUE (идентификатор из поля выбора). Как заставить работать второй параметр? Могу ли я найти его из Бина или из входного объекта JSF?

Если есть какой-то способ, который включает использование , есть ли способ установить с помощью кода Java в Bean? (Форма генерируется методом бобов).

Прошу прощения за мой английский, я стараюсь изо всех сил: о)

P.S .: Параметр даты важен в sqlMap, потому что используется JOIN. Я ищу по идентификатору, но другие таблицы объединены OBJECT_ID (версия) => и мне нужно получить только одну строку

Спасибо за ответы и хорошего дня

Worsik

Edit: Ящики для выбора генерируются по этому коду:

                uiInput = new HtmlSelectOneMenu();
                UISelectItems items = new UISelectItems();
                items.setValueExpression("value", createValueExpression(
                        "#{myBean.referencedList." + item.getName() + "}",
                            List.class));
                uiInput.getChildren().add(items);

Метод конвертера выглядит так:

public Object getAsObject(FacesContext context, UIComponent component, String value) 
{
    if (value.equals("")) {
        return null;
    }
    Class entityType = component.getValueExpression("value").getType(
            FacesContext.getCurrentInstance().getELContext());
    // TODO: need to get date value from form
            Date day = new Date();
    return myService(context).findEntityById(entityType, Long.valueOf(value), day);
}

entityType - класс модели для объекта из базы данных

myService вызывает объект Dao, а sqlMap называется

select * from object_table as t1 
JOIN other_table as t2 ON t1.object_fk = t2.object_id // (or version_id) 
where t1.id = #id:INTEGER#
and t2.valid_from <= #day:DATE#
and t2.valid_to >= #day:DATE#

1 Ответ

1 голос
/ 31 июля 2012

Я понял, как это сделать с помощью <f:attribute/> по коду в конвертере:

Date day = (Date) component.getAttributes().get("dateForSearch");

и по методу bean-компонента после генерации SelectBox с кодом:

uiInput.getAttributes().put("dateForSearch", getSelectedDate()); 

и на страницахбез динамической генерации форм, которые я использовал:

<SelectOneMenu> 
... 
<f:attribute name="dateForSearch" value="#{myBean.selectedDate}" />
</SelectOneMenu> 

Я надеюсь, что это будет не только вопрос с самоотдачей, но и поможет кому-то еще

...