1

我想知道是否可以从问题nesting-jsf-expression-strings中调整ExtendedBeanELResolver以处理这个嵌套的 EL 表达式:

#{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 回答后更新 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 在提交表单时尝试调用 setter 但无法正确评估它。

有任何想法吗?

更新 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 导入 javax.faces.bean.ManagedBean;导入 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 回答