Jsf 复合构件抛出中的myfaces动作方法
我在MyFaces2.1.10(与TomEE一起打包)中遇到了一个奇怪的问题,涉及复合组件和动作方法。本质上,看看下面的示例,myfaces似乎认为action方法是一个属性,并抛出一个ElException。同样的代码也适用于Mojarra(在JBoss7.1.2下) 知道我做错了什么吗 例外情况:Jsf 复合构件抛出中的myfaces动作方法,jsf,jsf-2,composite-component,myfaces,Jsf,Jsf 2,Composite Component,Myfaces,我在MyFaces2.1.10(与TomEE一起打包)中遇到了一个奇怪的问题,涉及复合组件和动作方法。本质上,看看下面的示例,myfaces似乎认为action方法是一个属性,并抛出一个ElException。同样的代码也适用于Mojarra(在JBoss7.1.2下) 知道我做错了什么吗 例外情况: javax.el.ELException: /index.xhtml: Property 'act' not found on type com.company.dept.beans.So
javax.el.ELException: /index.xhtml: Property 'act' not found on type com.company.dept.beans.SomeBean
org.apache.myfaces.view.facelets.compiler.AttributeInstruction.write(AttributeInstruction.java:55)
org.apache.myfaces.view.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:46)
org.apache.myfaces.view.facelets.compiler.UILeaf.encodeAll(UILeaf.java:505)
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541)
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1981)
org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:199)
名为“菜单”的复合组件:
这是由于应用程序的打包方式。其中一个包含xhtml的JAR缺少一个faces-config.xml文件,导致MyFaces找不到它。奇怪的是,莫哈拉似乎并不在乎
<composite:interface displayName="Navigation Menu Bar" shortDescription="Navigation menu bar">
<composite:attribute name="action" method-signature="java.lang.String action()"/>
</composite:interface>
<composite:implementation>
<div id="#{cc.clientId}:menuComponent">
<h:form>
<h:commandButton action="#{cc.attrs.action}" value="execute action" />
</h:form>
</div>
</composite:implementation>
<h:head>
</h:head>
<h:body>
<menu:menu action="#{someBean.act}"/>
</h:body>
</html>
package com.company.dept.beans;
import javax.inject.Named;
@Named
public class SomeBean {
public String act() {
System.out.println("ACT CALLED");
return "SUCCESS";
}
}