Вызов пустого метода из составного компонента
Я пытаюсь создать составной компонент JSF, и у меня возникают проблемы с вызовом метода. Мой компонент имеет несколько входов внутри и кнопку добавления, отвечающую за добавление дополнительных объектов в список, который передает повтор. Я хочу, чтобы эта кнопка вызывала другой метод в соответствии с управляемым компонентом, отвечающим за страницу, за которую он отвечает (поэтому в каждой xhtml должна быть переменная). Но каждый раз, когда я нажимаю кнопку, я получаю сообщение об исключении:
Класс com.test.TestMB не имеет свойства addAction.
Это мой компонент:
<composite:interface>
<composite:attribute name="id" required="false" />
<composite:attribute name="value" required="true" />
<composite:attribute name="addAction" required="true" />
</composite:interface>
<composite:implementation>
<ui:repeat value="#{cc.attrs.value}" >
<!-- some inputs and other components -->
</ui:repeat>
<p:commandButton actionListener="#{cc.attrs.addAction}" />
</composite>
И это моя реализация:
<cc:compositecomp id="component"
value="#{testMB.list}"
addAction="#{pessoaJuridicaMB.addToListMethod}" />
Мой класс TestMB не только содержит метод, но и отлично работает, если я изменю кнопку на:
<p:commandButton actionListener="#{testMB.addToListMethod}" />
AddToListMethod - это нечто очень простое:
public void addToListMethod() {
list.add(model); }
Любая идея о том, что не так и как я могу это исправить?
2 ответа
Вы должны добавить method-signature
приписать addAction
атрибут в определении интерфейса. Так что замените это:
<composite:attribute name="addAction" required="true" />
этим:
<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
Было что-то, что нужно добавить ответ lametaweb, по крайней мере, в моем случае, и я объясню это здесь в случае, если у кого-то есть такая же проблема: я получал wrong number of arguments
исключение. Дело в том, что actionListener всегда проходит как ActionEvent
объект в качестве параметра для метода, который он вызывает, и способ, которым lametaweb исправила мой код. Я говорил, что метод не будет передавать какой-либо параметр. Поэтому мне пришлось исправить здесь две вещи: объявить де ActionEvent
параметр в method-signature
и явно поместить этот объект в качестве полученного параметра моего метода void, чтобы они соответствовали количеству отправленных / полученных аргументов, даже если я не собираюсь использовать ActionEvent
в моем методе.
Окончательный код составной строки должен был быть:
<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
И мой метод
public void addToListMethod(ActionEvent event) {
list.add(model);
}