PrimeFaces命令按钮在重定向之前未调用actionListener

时间:2015-04-16 18:29:50

标签: jsf-2 primefaces

env是PrimeFaces + Glassfish + Hibernate。

“创建”命令按钮将重定向到PurchaseOrder表单页面,托管bean是会话范围的,PurchaseOrder与Product具有一对一的关系。自动完成将选择一个Product来填充bean。

我的设计是,它会在重定向之前创建一个新对象。

有两个问题,第一个,按钮没有调用actionListener,第二个是Product对象是null,但实际上它是在PostConstruct事件中创建的。

<p:commandButton id="createButton" actionListener="purchaseOrderController.prepareCreate" value="#{bundle.Create}"  action="Form.xhtml?faces-redirect=true" />

托管bean

@Named("purchaseOrderController")
@SessionScoped
public class PurchaseOrderController implements Serializable {   
    private PurchaseOrder selected;
    @PostConstruct
    public void init() {
        selected = new PurchaseOrder();
        selected.setProduct(new Product());     
    }

     public PurchaseOrder prepareCreate() {
        System.out.println("prepareCreate"); //didn't get invoked
        selected = new PurchaseOrder();
        return selected;
    }
    //....
}

产品自动填充

<p:autoComplete id="Product" value="#{purchaseOrderController.selected.product}" 
                                                    completeMethod="#{productController.completeProduct}" 
                                                    var="product" itemLabel="${product.name}" 
                                                    itemValue="#{product}" converter="productConverter" forceSelection="true" >                                       
                                        <p:ajax event="itemSelect" update=":PurchaseOrderForm" /> 
                                    </p:autoComplete>

错误消息

Caused by: javax.el.PropertyNotFoundException: /purchaseOrder/Form.xhtml @49,128 value="#{purchaseOrderController.selected.product}": Target Unreachable, 'null' returned null
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:133)
    at javax.faces.component.UIInput.updateModel(UIInput.java:832)
    ... 51 more
Caused by: javax.el.PropertyNotFoundException: Target Unreachable, 'null' returned null
    at com.sun.el.parser.AstValue.getTarget(AstValue.java:192)
    at com.sun.el.parser.AstValue.setValue(AstValue.java:226)
    at com.sun.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:294)
    at org.jboss.weld.el.WeldValueExpression.setValue(WeldValueExpression.java:64)
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:131)
    ... 52 more

1 个答案:

答案 0 :(得分:0)

这不是一个重复的问题。实际上我忘了在actionListener中使用EL表达式。

actionListener="purchaseOrderController.prepareCreate"

应该是

actionListener="#{purchaseOrderController.prepareCreate}"