пятница, 19 октября 2007 г.

JSF & Facelets

В чем была суть проблемы:
Когда в facelet'ах мы создаем template или tag на основе template'а, мы можем передавать в него параметры. Например custom tag с именем link имеет параметр myCoolAction, а тушка определения тэга выглядит банально:
<h:commandLink action="#{myCoolAction}">
Мы пользуемся тэгом:
<customNs:link myCoolAction="hello">
И ожидаем, что это равносильно <h:commandLink action="hello">.
Но не тут-то было. Facelet'ы передает аргументы внутрь template'а заворачивая их в ValueExpression. Тоесть у action аттрибута значение на самом деле оказывается не типа String, а типа ValueExpression. Умный commandLink это просекает и решает, что раз это не string, то это биндинг! А как же? Что это может быть еще? И обламывается. Ибо после eval'а на ValueExpression он таки получает String, а не MethodExpression - как нужно для биндинга к методу. Вот такая вот фигня.

Мне удалось это вылечить написав на java другой custom tag, который берет ValueExpression и превращает его в MethodExpression возвращающий оригинальный ValueExpression. Костыль.

На самом деле, это не самое страшное в faceletах. Хотя признаюсь, без facelet'ов JSF хочется об стену убить.

Комментариев нет:

Отправить комментарий