标题真的说明了一切。 我已经尝试了失败的错误:
Illegal attempt to pass arguments to a composite component lookup expression (i.e. cc.attrs.[identifier]).
我的尝试看起来像这样:
<composite:interface>
<composite:attribute name="removeFieldAction" method-signature="void action(java.lang.String)" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction('SomeString')}"/>
</composite:implementation>
这样做的正确方法是什么?
答案 0 :(得分:32)
这确实无法奏效。之后你不能传递“额外”参数。您声明的method-signature
必须在使用复合组件的一侧完成。 E.g。
<my:button action="#{bean.remove('Somestring')}" />
复合组件实现应该如下所示
<h:commandButton value="Remove" action="#{cc.attrs.removeFieldAction}" />
如果这不是你想要的,你真的想从复合组件方面传递它,那么我可以想到两种传递额外参数的方法:使用<f:attribute>
和动作监听器将它传递给一个attidional组件属性,或<f:setPropertyActionListner>
让JSF在调用操作之前将其设置为属性。但是两者都没有在复合组件中没有变化。您至少需要请求整个bean作为复合组件的属性。
以下是<f:setPropertyActionListener>
的示例。这会在调用操作之前设置属性。
<composite:interface>
<composite:attribute name="bean" type="java.lang.Object" />
<composite:attribute name="action" type="java.lang.String" />
<composite:attribute name="property" type="java.lang.String" />
</composite:interface>
<composite:implementation>
<h:commandButton value="Remove" action="#{cc.attrs.bean[cc.attrs.action]}">
<f:setPropertyActionListener target="#{cc.attrs.bean[cc.attrs.property]}" value="Somestring" />
</h:commandButton>
</composite:implementation>
将用作
<my:button bean="#{bean}" action="removeFieldAction" property="someString" />
使用上面的示例,bean应该看起来像
public class Bean {
private String someString;
public void removeFieldAction() {
System.out.println(someString); // Somestring
// ...
}
// ...
}
如果您遵守特定约定,您甚至可以完全省略property
属性。