У меня была та же проблема, и я обнаружил, что это произошло из-за того, что мой метод действия вызвал исключение IllegalArgumentException. Между тем об этом сообщается как об ошибке: Метод составного действия генерирует исключение PropertyNotFoundException, когда метод генерирует любое исключение .
Сложность (по крайней мере, для меня) заключалась в том, что мое приложение работало нормально, пока я не переместил часть кода в составной компонент (CC). До того, как мое приложение перехватило IAE и показало хорошее сообщение об ошибке, но при использовании CC проверка JSF (или что-то еще ...) сначала улавливает это и выдает это довольно запутанное сообщение об ошибке.
Я подтвердил это, используя измененную версию тестового кода, предоставленного BalusC (см. Ниже). На тестовой странице отображаются два компонента кнопки ввода и отправки. Если вы вводите что-то в текстовое поле (кроме «паники» (без кавычек)), то работает и CC-версия, и «встроенная» версия (смотрите вывод std). Если вы введете «панику» в «встроенной» версии, вы заметите IAE, как и ожидалось, но если вы введете то же самое в верхней «CC-версии», вы увидите вместо этого исключение PropertyNotFoundException. Кажется, что JSF смущает IAE и решает, что атрибут должен быть свойством, а не методом действия, в конце концов ... Не уверен, является ли это ошибкой или функцией. Это согласно Spec, кто-нибудь знает?
Итак, вывод здесь заключается в том, что вы не можете использовать методы действия в CC с bean-компонентами, которые генерируют исключения. Для меня это означает, что я не могу использовать составные компоненты. Грустно!
Надеюсь, это поможет ...
/resources/components/test.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
<cc:attribute name="text"/>
<cc:attribute name="action" method-signature="java.lang.String action()" required="true" />
</cc:interface>
<cc:implementation>
<h:form>
<h:inputText value="#{cc.attrs.text}"/>
<h:commandButton value="submit" action="#{cc.attrs.action}" />
</h:form>
</cc:implementation>
/test.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite/components">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<!-- text and cmd-button as cc -->
<cc:test text="#{bean.text}" action="#{bean.submit}" />
<hr/>
<!-- text and cmd-buuton inline -->
<h:form id="inline">
<h:inputText value="#{bean.text}"/>
<h:commandButton value="submit2" action="#{bean.submit}" />
</h:form>
</h:body>
</html>
И последний Боб:
@ManagedBean
@RequestScoped
public class Bean {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String submit() {
if (text.equalsIgnoreCase("panic")){
throw new IllegalArgumentException("Panic!");
}
System.out.println(text);
return null;
}
}