java - Primefaces DataTable+LazyDataModel won't pass setPropertyActionListener in request scope -
i have primefaces datatable based on lazydatamodel. managed load data in table not being able use setpropertyactionlistener show selected items in dialog nor edit rows. using request scope , noticed issue seems solved in session scope, rather use former (view scope won't load data in table). tried override getrowdata , getrowkey methods don't called. have none of issues when don't use lazy model approach.
could injection related issue missing or lazydatamodel won't work outside session scope?
public class lazydatamodelbase<t> extends lazydatamodel<t> { private volatile abstractfacade<t> facade; public lazydatamodelbase(abstractfacade<t> facade) { super(); this.facade = facade; } public final abstractfacade<t> getfacade() { return facade; } public final void setfacade(abstractfacade<t> facade) { this.facade = facade; } @override public list<t> load(int first, int pagesize, string sortfield, sortorder sortorder, map<string, string> filters) { list<t> list = facade.load(first, pagesize, sortfield, sortorder, filters); if (list == null) { throw new runtimeexception("problem."); } // using following line debugging: // throw new runtimeexception(list.tostring()); setrowcount(facade.count()); return list; }
}
userlazydatamodel looks this
public class userlazydatamodel extends lazydatamodelbase<user> { private userfacade facade; public userlazydatamodel(userfacade facade) { super(facade); } public list<user> getrowdata(string rowkey) { return facade.findbyid(integer.parseint(rowkey)); // findbyid defined in userfacade } ...
my backing bean looks this
@named(value = "usercontroller") @requestscoped public class usercontroller implements serializable { private user current; @ejb private userfacade ejbfacade; private lazydatamodelbase<user> items; private integer itemid; private int pagesize = 10; public usercontroller() { items = new userlazydatamodel(ejbfacade); } public userfacade getuserfacade() { return ejbfacade; } public void setuserfacade(userfacade facade) { this.ejbfacade = facade; //items.setfacade(facade); } public user getselected() { if (current == null) { this.current = new user(); } return current; } public void setselected(user selected) { this.current = selected; } public void setselected(integer id) { this.itemid = id; current = ejbfacade.find(id); } public integer getitemid() { return itemid; } public void setitemid(integer id) { this.itemid = id; current = ejbfacade.findbyid(id); } public int getpagesize() { return pagesize; } public void setpagesize(int pagesize) { this.pagesize = pagesize; } private void setdefaultstatus() { current.setstatusid(ejbfacade.getdefaultstatus()); } public string create() { current.setdatecreated(new date()); if (current.getstatusid() == null) { setdefaultstatus(); } current.hashpassword(); try { ejbfacade.create(current); jsfutil.addsuccessmessage("user guardado exitosamente"); return "success-create"; } catch (exception e) { jsfutil.adderrormessage(e, "a persistence error ocurred."); return null; } } public string preparelist() { //current = null; return "index?faces-redirect=true"; } public string preparecreate() { return "create?faces-redirect=true"; } public string prepareedit() { return "edit"; } public void onrowselect() { current = ejbfacade.findbyid(itemid); } public void update() { try { ejbfacade.edit(current); jsfutil.addsuccessmessage("user guardado exitosamente"); } catch (exception e) { jsfutil.adderrormessage(e, "a persistence error ocurred."); } } public void delete() { try { ejbfacade.remove(current); current = null; jsfutil.addsuccessmessage("role deleted"); } catch (exception e) { jsfutil.adderrormessage(e, resourcebundle.getbundle("/bundle").getstring("persistenceerroroccured")); } } public lazydatamodelbase<user> getitems() { items.setfacade(ejbfacade); items.setpagesize(pagesize); return items; } public void setitems(lazydatamodelbase<user> model) { this.items = model; }
}
and view
<h:form prependid="false"> <p:commandbutton immediate="true" style="margin: 10px 0;" value="nuevo" icon="ui-icon-plus" action="#{usercontroller.preparecreate}" ajax="false" /> </h:form> <h:form id="listform"> <br /> <p:growl id="messages" showdetail="true"/> <p:datatable var="item" value="#{usercontroller.items}" rows="#{usercontroller.pagesize}" lazy="true" selectionmode="single" rowkey="#{item.userid}" selection="#{usercontroller.selected}" paginator="true" id="itemstable" rowsperpagetemplate="10,30,50"> <p:ajax event="rowselect" listener="#{usercontroller.onrowselect}" update=":listform:itemdisplay" oncomplete="itemdialog.show()" /> <p:column headertext="id" id="userid" sortby="#{item.userid}" style="width: 10px;"> #{item.userid} </p:column> <p:column headertext="first name" id="first-name" sortby="#{item.firstname}"> #{item.firstname} </p:column> <p:column headertext="last name" id="last-name" sortby="#{item.lastname}"> #{item.lastname} </p:column> <p:column headertext="email" id="email" sortby="#{item.email}" filterby="#{item.email}"> #{item.email} </p:column> <p:column headertext="user" id="name" sortby="#{item.username}"> #{item.username} </p:column> <p:column headertext="birthdate" id="birthdate" sortby="#{item.birthdate}"> <h:outputtext value="#{item.birthdate}" > <f:convertdatetime type="date" pattern="yyyy/mm/dd"/> </h:outputtext> </p:column> <p:column headertext="role" id="status" sortby="#{item.statusid.name}"> #{item.statusid.name} </p:column> <p:column style="width:32px;"> <h:panelgrid columns="3" class="datarow-icons"> <p:commandbutton icon="ui-icon-trash" update=":listform:itemstable :listform:confirmdelete" oncomplete="deletedialog.show()"> <f:setpropertyactionlistener value="#{item}" target="#{usercontroller.selected}" /> </p:commandbutton> <p:commandbutton icon="ui-icon-pencil" immediate="true" action="#{usercontroller.prepareedit}" ajax="false"> <f:setpropertyactionlistener value="#{item}" target="#{usercontroller.selected}" /> </p:commandbutton> <p:commandbutton id="select-button" update=":listform:itemdisplay" oncomplete="itemdialog.show()" icon="ui-icon-search" title="view" > <f:setpropertyactionlistener value="#{item}" target="#{usercontroller.selected}" /> </p:commandbutton> </h:panelgrid> </p:column> </p:datatable> <p:dialog widgetvar="itemdialog" resizable="false" showeffect="explode" hideeffect="explode" header="item detail"> <p:panelgrid columns="2" id="itemdisplay" style="width: 250px;"> <h:outputtext value="id: " /> <h:outputtext value="#{usercontroller.selected.userid}" /> <h:outputtext value="name: " /> <h:outputtext value="#{usercontroller.selected.username}" /> <h:outputtext value="description: " /> <h:outputtext value="#{usercontroller.selected.firstname}" /> </p:panelgrid> </p:dialog> <p:confirmdialog id="confirmdelete" header="confirm delete" widgetvar="deletedialog" severity="alert" showeffect="fade" hideeffect="fade" closable="false" message="¿realmente desea borrar '#{usercontroller.selected.tostring()}' ?"> <p:commandbutton id="decline" value="not yet" onclick="deletedialog.hide();" type="button" /> <p:commandbutton id="accept" value="confirmar" update=":listform" oncomplete="deletedialog.hide();" action="#{usercontroller.delete}" ajax="false"> </p:commandbutton> </p:confirmdialog> </h:form>
i managed rowselect work overriding getrowdata in userlazydatamodel (a subclass of lazydatamodelbase showed) follows:
@override public user getrowdata(string rowkey) { try { return ((userfacade) getfacade()).findbyid(integer.parseint(rowkey)); } catch (exception e) { return null; } }
and deleting
rowkey="#{item.userid}"
attribute datatable declaration. declared facade in subclass userlazydatamodel , default different parent class lazydatamodelbase (set null). solution delete field subclass , access parent fiel means of getfacade method casting userfacade.
setpropertyactionlistener not working yet.
Comments
Post a Comment