Icefaces 2.0: проблема со льдом: selectInputDate внутри пользовательского компонента - PullRequest
0 голосов
/ 15 марта 2011

Я пытаюсь создать пользовательский компонент jsf2, чтобы избежать привязки конвертера и тегов сообщений для моих полей даты.Я сделал это с Icefaces 1.x, используя шаблоны.Однако в JSF 2 я был вынужден использовать составные компоненты;это не так хорошо, как я надеялся.

Составной компонент был успешно создан:

<composite:interface>
    <composite:attribute name="style" />
    <composite:attribute name="partialSubmit" />
    <composite:attribute name="rendered" />
    <composite:attribute name="immediate" />
    <composite:attribute name="value" required="true" />
    <composite:attribute name="pattern" required="true" />
</composite:interface>

<composite:implementation>
    <ice:panelGroup rendered="#{cc.attrs.rendered}">
        <ice:selectInputDate value="#{cc.attrs.value}"
            style="#{cc.attrs.style}" id="input" renderAsPopup="true"
            partialSubmit="#{cc.attrs.partialSubmit }"
            immediate="#{cc.attrs.immediate }">
        </ice:selectInputDate>
        <ice:message for="input" style="color: red; display: block"></ice:message>
    </ice:panelGroup>
</composite:implementation>

Когда свойство имеет значение null, компонент ведет себя так, как ожидается.Однако, когда я загружаю данные из своей базы данных, я получаю экземпляр java.sql.Date (несмотря на то, что мой объект использует java.util.date - первый расширяет последний), я получаю это исключение:

java.lang.IllegalArgumentException: Невозможно преобразовать 03.03.11 20:00 типа java.util класса. Дата в класс java.sql.Date

Что странно, еслиЯ использую лед: selectInputDate вне моего составного компонента, я не получаю эту ошибку.Есть идеи?

1 Ответ

0 голосов
/ 16 марта 2011

Хорошо, это может показаться слишком экстремальным для обхода: перестройка Tomcat. Я полагал, что tomcat не меняется так часто, как JSF или ICEFaces. Назовите это взломать, если нужно; это решает мою проблему ...

Загрузите исходный код tomcat для используемой версии и найдите файл с именем ELSupport.java. Ищите метод с этой подписью:

public static final Object coerceToType(final Object obj,
        final Class<?> type) throws ELException {

Теперь добавьте следующие строки прямо над строкой, которая выдает исключение ELException:

if (java.util.Date.class.isAssignableFrom(obj.getClass())){
    return obj;
}

Это в значительной степени просто предотвращает появление исключения, когда объект является экземпляром подкласса из java.util.Date.

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

...