Вызов пустого метода из составного компонента

Я пытаюсь создать составной компонент 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); 
}
Другие вопросы по тегам