Переданный аргумент методу внутри составного компонента не работает в MyFaces

Я успешно смог передать аргумент методу внутри составного компонента, используя этот метод из BalusC (передать аргумент в атрибут действия составного компонента), однако это кажется работать на Mojarra, но не на MyFaces 2.0.4-2.0.5 (упакован в Websphere 8.5 + OpenWebBeans). Я размещаю свой код ниже

Это мой cc

 <cc:interface>     
    <cc:attribute name="value" />   
    <cc:attribute name="bean" />
    <cc:attribute name="myAction" />
    <cc:attribute name="property" />
</cc:interface>
<cc:implementation>
    <rich:dataTable value="#{cc.attrs.value}" var="galleryFile">
        ...
        <a4j:commandLink execute="@this" action="#{cc.attrs.bean[cc.attrs.myAction]}">
            <f:setPropertyActionListener
                            target="#{cc.attrs.bean[cc.attrs.property]}"
                            value="#{galleryFile}" />
        </a4j:commandLink>
    </rich:dataTable>
</cc:implementation>

Извне я делаю это

<mycomp:reportGallery value="#{listPopup.files}" id="listReportGallery" 
        bean="#{listPopup}" myAction="fileSelected" property="selectedFile"/>

Внутри ListPopup ViewScoped bean, у меня

@ManagedBean(name = "listPopup")
@ViewScoped
public class ListPopup implements Serializable {
     private EpiFSObject selectedFile;
     public void setSelectedFile(final EpiFSObject selectedFile) {
         this.selectedFile = selectedFile;
     }
     public EpiFSObject getSelectedFile() {
         return selectedFile;
     }
     public void fileSelected() {
         ...
     }
}

Когда я нажимаю на ссылку, я получил это исключение

javax.el.PropertyNotFoundException: /resources/infor/reportGallery.xhtml at line 79 and column 89 action="#{cc.attrs.bean[cc.attrs.myAction]}": Property 'fileSelected' not found on type com.infor.om.ui.bean.ListPopup
at org.apache.myfaces.view.facelets.el.TagValueExpression.getValue(TagValueExpression.java:89)
at org.apache.myfaces.view.facelets.el.LocationValueExpression.getValue(LocationValueExpression.java:90)

Поэтому он fileSelected является свойством вместо метода. Кто-нибудь знает, как решить эту проблему, пожалуйста? Мое подозрение в том, что эта проблема исходит из OpenWebBeans

EDIT Я беру предложение от BalusC сделать хак, чтобы предоставить getFileSelected(), поскольку он запрашивает fileSelected как свойство вместо метода

public String getFileSelected(){
    fileSelected();
    return "";
}

но я все еще получил исключение

java.lang.NullPointerException
at org.apache.myfaces.view.facelets.el.ValueExpressionMethodExpression.getExpressionString(ValueExpressionMethodExpression.java:70)
at org.apache.myfaces.view.facelets.el.TagMethodExpression.getExpressionString(TagMethodExpression.java:101)
at javax.faces.component._MethodExpressionToMethodBinding.getExpressionString(_MethodExpressionToMethodBinding.java:60)
at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:97)
at javax.faces.component.UICommand.broadcast(UICommand.java:120)
at org.richfaces.component.RowKeyContextEventWrapper.broadcast(RowKeyContextEventWrapper.java:104)
at org.richfaces.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:448)
at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:973)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:275)
at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1285)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:711)
at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1225)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:775)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:457)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
at com.infor.om.ui.servlets.filter.LoginFilter.doFilter(LoginFilter.java:151)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.infor.om.ui.servlets.filter.ResponseFilter.doFilter(ResponseFilter.java:110)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.infor.om.ui.servlets.filter.LoginFilter.doFilter(LoginFilter.java:151)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.infor.om.ui.filter.RequestHeaderLogger.doFilter(RequestHeaderLogger.java:77)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.infor.om.ui.filter.RequestHeaderLogger.doFilter(RequestHeaderLogger.java:77)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:908)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:459)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:526)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:312)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:283)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1815)

Пожалуйста, помогите. Спасибо вам

Ответы

Ответ 1

Ну, я исправил это, создав общий абстрактный bean, который имеет эти методы, поэтому теперь мне просто нужно пройти в bean и вызвать cc.attrs.bean.commonMethod() вместо cc.attrs.bean[cc.attrs.myAction]. Это решит проблему. Не уверен, почему myfaces или OWB не понимает этот синтаксис cc.attrs.bean[cc.attrs.myAction]

Ответ 2

У нас была та же проблема. Мы смогли исправить это, обновив AppServer с 8.5.0.0 до 8.5.0.2.