Ответ 1
Это является следствием новой функции EL 2.2 вызова метода в выражении значения через синтаксис #{bean.method()}
вместо ссылки на свойство с помощью синтаксиса #{bean.property}
(который действительно должен быть точного типа ActionListener
). Он не работал бы с EL 2.1 или старше, и он также не работал бы, когда вы удаляете аргументы и круглые скобки. Этот документ был написан, когда EL 2.2 не существовал (он фактически не был изменен по сравнению с версия JSF 1.2 с мая 2006 года, был введен EL 2.2 Декабрь 2009 г.). Однако я согласен с тем, что для этого требуется обновление этой части, поскольку это путает начинающих.
Ответ, который вы нашли, сделал его точки на основе документа, но ответчик, похоже, не понял, основываясь на вопросе о том, что в то время как binding="#{testController.nodeListener}"
не удалось, binding="#{testController.nodeListener(event)}"
на самом деле работал. Это не дает вам возможности передать ActionEvent
. Ответ был лучше, если он предложил просто использовать binding="#{testController.nodeListener()}"
вместо этого и получить информацию о событиях другим способом, например, вызывая UIComponent#getCurrentComponent()
или даже передав #{component}
в качестве аргумента. Конечно, если вам действительно нужна его рука.
<h:commandLink value="link">
<f:actionListener binding="#{bean.someMethod(component)}"/>
</h:commandLink>
public void someMethod(UIComponent component) {
System.out.println("It was called on: " + component); // HtmlCommandLink
}