Icefaces 2.0: проблема со льдом:selectInputDate внутри пользовательского компонента

Я пытаюсь создать пользовательский компонент 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.Date в класс java.sql.Date.

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

1 ответ

Решение

Хорошо, это может показаться слишком экстремальным в обходе: перестройка 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? Я никогда не делал ничего с открытым исходным кодом, поэтому я не знаю, как это работает.

Другие вопросы по тегам