Injection failed on form submit using rich:datatable binding
greko Apr 4, 2007 1:35 PMHi !
I want to have the rows of my <rich:datatable> clickable.
OnRowClick, i want to perform an ajax4jsf action using <a4j:support>.
Here is my form :
<h:form id="sampleAction"> <h:commandButton id="sampleAction" value="sampleAction!" action="#{sampleAction.sampleAction}"/> <rich:dataTable id="tatable" cellpadding="0" cellspacing="0" width="700" border="0" value="#{sampleAction.myDataList}" var="myDataItem" binding="#{sampleAction.myDataTable}"> <!-- This is what i want to do <a4j:support actionListener="#{sampleAction.rowSelected}" event="onRowClick" /> --> <rich:column> <f:facet name="header">Select</f:facet> <h:outputText value="#{myDataItem}" /> </rich:column> </rich:dataTable> </h:form>
Here is my backing stateful bean :
@Stateful @Name("sampleAction") @Scope(SESSION) public class SampleActionBean implements SampleAction { @Logger private Log log; @In(create=true) FacesMessages facesMessages; // seam-gen method public String sampleAction() { // implement your business logic here log.info("sampleAction.sampleAction() action called"); // facesMessages.add("sampleAction"); return "success"; } // Properties ---------------------------------------------------------- @DataModel public String[] myDataList = {"Valeur 1", "Valeur 2", "Valeur 3", "Valeur 4", "Valeur 5"}; public String myDataItem; public UIData myDataTable; // Actions ---------------------------------------------------------- public String rowSelected(ActionEvent event) { myDataItem = (String) getMyDataTable().getRowData(); log.info("rowSelected ==> " + myDataItem); return "success"; } public String getSelectedItem() { log.info("sampleAction.getSelectedItem() called"); log.info("----> " + myDataItem); // Do your thing with the MyData item in myDataItem. //facesMessages.add("Get selected item : " + myDataItem); return "success"; // Navigation case. } public String getMyDataItem() { return myDataItem; } public void setMyDataItem(String myDataItem) { this.myDataItem = myDataItem; } public String[] getMyDataList() { return myDataList; } public void setMyDataList(String[] myDataList) { this.myDataList = myDataList; } public UIData getMyDataTable() { return myDataTable; } public void setMyDataTable(UIData myDataTable) { this.myDataTable = myDataTable; } @Destroy @Remove public void destroy() { } }
BUT ... on submit (ajax or simple action with my <h:commandButton>) i have the following exception :
19:26:02,890 ERROR [ExceptionFilter] exception root cause javax.faces.el.EvaluationException: /sampleAction.xhtml @31,47 binding="#{sampleAction.myDataTable}": Exception setting property myDataTable of base with class org.javassist.tmp.java.lang.Object_$$_javassist_1 at com.sun.facelets.el.LegacyValueBinding.setValue(LegacyValueBinding.java:74) at org.apache.myfaces.shared_impl.util.RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(RestoreStateUtils.java:70) at org.apache.myfaces.shared_impl.util.RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(RestoreStateUtils.java:41) at org.apache.myfaces.shared_impl.util.RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(RestoreStateUtils.java:78) at org.apache.myfaces.shared_impl.util.RestoreStateUtils.recursivelyHandleComponentReferencesAndSetValid(RestoreStateUtils.java:41) at org.apache.myfaces.lifecycle.LifecycleImpl.restoreView(LifecycleImpl.java:179) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:66) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) ... Caused by: javax.ejb.EJBException: org.jboss.seam.RequiredException: In attribute requires non-null value: sampleAction.facesMessages at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69) at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83) at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
It's just like if my injected facesMessages is not injected after a submit.
If I dont use any @In-jected attribute, it works.
If i do, the bind="..." attribute of my <rich:dataTable> makes me go into troubles...
Please, any idea ?