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

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

Любая идея о том, что не так и как я могу это исправить?


person Denis Klein    schedule 22.09.2015    source источник
comment
Вы пробовали мой ответ? Если это решит вашу проблему, пожалуйста, примите это. Чтобы пометить ответ как принятый, нажмите на галочку рядом с ответом, чтобы переключить его с пустого на зеленый.   -  person Javier Haro    schedule 23.09.2015
comment
Извините, что так долго не видел ваш ответ ... Я только что попробовал, но это не сработало: я получаю java.lang.IllegalArgumentException: неправильное количество аргументов ... есть идеи, почему?   -  person Denis Klein    schedule 23.09.2015


Ответы (2)


Вы должны добавить атрибут method-signature к атрибуту addAction в определении интерфейса. Итак, замените это:

<composite:attribute name="addAction" required="true" />

этим:

<composite:attribute name="addAction" required="true" 
    method-signature="void addAction(javax.faces.event.ActionEvent)" />
person Javier Haro    schedule 22.09.2015
comment
Я получаю java.lang.IllegalArgumentException: неправильное количество аргументов... :( - person Denis Klein; 23.09.2015
comment
О, я только что нашел решение! Я опубликую новый ответ на мой собственный вопрос, объясняющий! - person Denis Klein; 23.09.2015

Было что-то, что нужно было добавить к ответу lametaweb, по крайней мере, в моем случае, и я объясню это здесь, если у кого-то еще возникнет такая же проблема: я получал исключение wrong number of arguments. Дело в том, что actionListener всегда передает объект ActionEvent в качестве параметра метода, который он вызывает, и то, как lametaweb исправила мой код, я говорил, что метод не будет передавать никаких параметров. Поэтому мне пришлось исправить здесь две вещи: объявить параметр de 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); 
}
person Denis Klein    schedule 23.09.2015