8

シンプルな Facelet タグがあります。

<ui:composition>
  <ui:insert />
</ui:composition>

c:set複数のタグを宣言することを避けるために使用されます。
という名前で facelets taglib ライブラリに登録し、次のviewように使用するとします。

<my:view bean="#{myController}">
  <p:inputText value="#{bean.value}>
    <p:ajax event="blur" process="@this" listener="#{bean.handleValueChanged}" />
  </p:inputText>
</my:view>

属性valueは によって完全に解決されますがp:inputText、これがp:ajaxスローされます:

Target Unreachable, identifier 'bean' resolved to null
javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
    at com.sun.el.parser.AstValue.getTarget(AstValue.java:153)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:237)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:47)

それはバグですか、それとも予想される動作ですか?

更新: f:ajax で同じことを試したところ、うまくいきました!

ところで、環境は次のとおりです:
Glassfish 3.1.2
PF 3.0、3.2、3.3

Update2 :
この問題RichFacesはまったく同じです。PrimeFaces のバグのようです (今日、PF バグ トラッカーに問題を投稿します)。

4

2 に答える 2

4

私の同僚は、この問題を解決するためのパッチを提供しました。

の現在の実装AjaxBehaviorListenerImpl#processAjaxBehaviourは次のとおりです。

public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException {
        FacesContext context = FacesContext.getCurrentInstance();
        final ELContext elContext = context.getELContext();

        try{
            listener.invoke(elContext, new Object[]{});
        } catch (MethodNotFoundException mnfe) {
            MethodExpression argListener = context.getApplication().getExpressionFactory().
                        createMethodExpression(elContext, listener.getExpressionString(), null, new Class[]{event.getClass()});

            argListener.invoke(elContext, new Object[]{event});
        }
    }

彼は、次のように調整することを提案しています。

import javax.faces.view.facelets.FaceletContext;

public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException {
        FacesContext context = FacesContext.getCurrentInstance();
        final ELContext elContext = context.getELContext();

        try{
            listener.invoke(elContext, new Object[]{});
        } catch (MethodNotFoundException mnfe) {
            FaceletContext fc = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
            MethodExpression argListener = context.getApplication().getExpressionFactory().
                        createMethodExpression(fc, listener.getExpressionString(), null, new Class[]{ event.getClass() });

            argListener.invoke(elContext, new Object[]{ event });
        }
    }

これが PF チームによって承認されることを願っています。

于 2012-05-23T10:48:29.020 に答える
-1

この調整は、単一の ui:include よりも複雑なユース ケースでは機能しません。

<c:forEach items="#{items}" var="item">
            <ui:include src="#{item.uri}">
                <ui:param name="itemBean" value="#{item.bean}"/>
            </ui:include>

</c:forEach>

新しい MethodExpression 内でリスナーの変数マッパーを再利用する必要があると思います

于 2012-06-26T06:54:58.817 に答える