Question

I have some fields of a bean that I need to show programmatically. Is something like this:

         HtmlPanelGrid panel = new HtmlPanelGrid();
         panel.setColumns(4);

         HtmlOutputLabel fieldOut = new HtmlOutputLabel();
         fieldOut.setId("fieldOutId");
         fieldOut.setValue("name");
         panel.getChildren().add(fieldOut);
         HtmlInputText fieldIn = new HtmlInputText();
         fieldIn.setId("fieldInId");
         fieldIn.setPartialSubmit(true);
         fieldIn.setValueExpression(
          "field", UtilFaces.createValueExpression("#{newElementBean.fieldName}",String.class));

         panel.getChildren().add(fieldIn); 
         mainForm.getChildren().add(panel);

In newElements.xhtml i've defined a form which is binded to mainForm, in this way:

    <ice:form binding="#{newElementBean.mainForm}">
  <ice:inputText id="ANOTHERFIELD" value="#{newElementBean.anotherField}"/>
  <ice:commandButton  action="#{newElementBean.save}"  value="Save"/>
</ice:form>

When I click on the save button and I go to the next view, the field "ANOTHERFIELD" has taken the value from the bean, and shows up correctly, but the fields that were dinamically generated shows empty. Its values in the backing bean also are null. It's like the ValueExpression is not working for the HtmlInputText that I created in the backing bean. I'm using Icefaces 3.3 with Mojarra 2.1.17.

How is this caused and how can I solve it?

Was it helpful?

Solution

I solved it. I made two mistakes:

  1. The proper setValueExpression call is like this:

    fieldIn.setValueExpression("value", UtilFaces.createValueExpression("#newElementBean.fieldName}");
    

    I was incorrectly using "field1" as 1st argument instead of "value".

  2. This is not visble in the question, but my createValueExpression() helper method was also wrong. The following is working for me:

    public static ValueExpression createValueExpression(String expression) {
        Application app = FacesContext.getCurrentInstance().getApplication();
        ExpressionFactory elFactory = app.getExpressionFactory();
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        return elFactory.createValueExpression(elContext, expression, Object.class);
    }
    
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top