1

このネストされた EL 式を処理するために、ネストされたjsf-expression-stringsの質問からExtendedBeanELResolverを適応させることが可能かどうかを知りたいです。

#{controllerBean.getBean('userProfileBean', component).street}*

これにより、 controllerBean.getBeanは Bean userProfileBeanを返します。ExtenedBeanELResolver次の例外を取得します。

SCHWERWIEGEND: javax.el.PropertyNotFoundException: /WEB-INF/templates/modification/userProfile.xhtml @35,196 value="#{controllerBean.getBean('userProfileBean', component).street}": Property 'getBean' not found on type com.something.ControllerBean

追加のブラケットを挿入すると機能しますが、今よりもさらに見栄えが悪くなります。

#{(controllerBean.getBean('userProfileBean', component)).street}*

追加のブラケットなしで行うことは可能ですか?

CycDemoの回答後のUPDATE 1:

奇妙な問題。私が入れたら

<h:inputText value="#{beanOne.getBean('data').title}" />

フォーム内でページがレンダリングされますが、フォームを送信するまでのみです。その後、同じエラーが表示されます。

WARNUNG: /WEB-INF/templates/home.xhtml @61,66 value="#{beanOne.getBean('data').title}": Property 'getBean' not found on type com.something.BeanOne

に変更すると

<p:inputText value="#{beanOne.getBean('data').title}" />

ページは最初はレンダリングされません。問題は、フォームが送信されたときに JSF がセッターを呼び出そうとしていますが、正しく評価できないことだと思います。

何か案は?

更新 2

どうやら JSF はgetGetBean()を呼び出そうとしているようです。これは、間違っているBeanOneのプロパティを探しているためです(Eclipse にブレークポイントがありました)。

@ManagedBean
@ViewScoped
public class BeanOne {

  private Object bean = new String("something");

  public Object getBean(String name) {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().evaluateExpressionGet(context,
        "#{" + name + "}",
        Object.class);
  }

  public Object getGetBean() {
    return bean; // <-- will be called by JSF
  }

  public void setGetBean(Object bean) {
    this.bean = bean;
  }

}
4

1 に答える 1

1

確実に

    #{(controllerBean.getBean('userProfileBean', component)).street}
    change to
    #{controllerBean.getBean('userProfileBean', component).street}

テストするとJSF 2.0で動作します。

を使用しjboss-elます。jarファイルのダウンロードはこちら

BeanOne.java import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped;

@ManagedBean(name="BeanOne")
@RequestScoped
public class BeanOne {
    private Data data;

    public Data getBean(String title) {
        data = new Data(title);
        return data;
    }
    public void show() {
        System.out.println("User Input ==>" + data.getInput());
    }
}

日付.java

public class Data {
    private String title;
    private String input;

    public Data(String title) {
        this.title = title;
    }

    public String getInput() {
        return input;
    }

    public void setInput(String input) {
        this.input = input;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

pageOne.xml

<h:form>
    <h:inputText value="#{BeanOne.getBean('Test').input}"/><br/>
    <h:commandButton value="Show" action="#{BeanOne.show}"/>
</h:form>

次の構成を web.xml に追加します。

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>
于 2012-10-17T07:57:52.253 に答える