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