Double-click seems to disrupt Wicket-Spring injection -
our application uses wicket front-end, spring injection load our doas , manage transactions.
we have discovered several of our users double clicking on links/buttons , somehow disrupting spring injection, subsequent calls whateverdao.dostuff(obj) throw n.p.e. application runs on our client's internal network, , now, have politely requested client spread word amongst team single clicks work on features. apparent becoming problem them.
a common use case involves "search" screen showing list of foo objects in system, can filtered via search parameters if desired, , when item clicked user taken detail page specific foo, in read-only mode. next, user may click "edit" button in corner switch edit mode. then, user might make changes , click "save" (or possibly click "delete" remove item.)
this scenario involves dao calls @ 3 steps: 1. on search page, when item clicked, load basic details of item. 2. on detail page in read-only mode, when edit clicked, load complete details of item. 3a. on detail page in edit mode, when save clicked, persist changes. 3b. on detail page in edit mode, when delete clicked, delelte.
in of these cases, if user double clicked on previous step, next step produces error. reproducablitiy 33% variations between browsers , oss.
any insight on preventing this?
in samples below, basepage our custom extension of wicket's webpage containing our menus , other common page elements, , pagetype enumeration of create, edit, , read_only details.
sample code search page (java shown, html expect):
import org.apache.wicket.spring.injection.annot.springbean; // , other imports public class foomanagerpage extends basepage { @springbean private transient foodao foodao; public foomanagerpage() { sortabledataprovider<foo> provider = new sortabledataprovider<foo>(foodao); add(new feedbackpanel("feedback"); final form<foo> searchfooform = new form<foo>("searchfooform", new compoundpropertymodel<foo>(new foo())); // form's search parameter's go here // 'search' button filters table below add(searchfooform) list<icolumn<foo>> columns = new arraylist<icolumn<foo>>(); columns.add(new propertycolumn<foo>(model.of("name"), "name", "name")); // couple other columns here datatable footable = new ajaxfallbackdefaultdatatable<foo>("footable", columns, provider, 10){ @override protected item<foo> newrowitem(string id, int index, final imodel<foo> model){ item<foo> item = super.newrowitem(id, index, model); item.add(new ajaxeventbehavior ("onclick") { @override protected void onevent(ajaxrequesttarget target) { foo foo = foodao.load(model.getobject().getid()); setresponsepage(new fooviewpage(foo, pagetype.read_only)); } }); return item; } }; add(footable); } }
sample code view page (java shown, html expect)::
// several imports, including spring bean public class fooformpage extends basepage { @springbean private transient foodao foodao; public fooformpage(final foo foo, pagetype type) { form<foo> fooform = new form<foo>("fooform", new compoundpropertymodel<foo>(foo)); // of foo's input elements go here // enabled or disabled , invisible based on pagetype add(fooform); submitlink submitbutton = new submitlink("save", fooform){ @override public void onsubmit() { super.onsubmit(); //***** double click on edit button can cause foodao n.p.e. here ***** foodao.save(createinitiativeform.getmodelobject().getid()); changepagetype(pagetype.view, createfooform.getmodelobject()); } }; add(submitbutton); ajaxlink<void> editbutton = new ajaxlink<void>("edit"){ @override public void onclick(ajaxrequesttarget target) { // reload item db //***** double click on search page item cause foodao n.p.e. here ***** foo foo = foodao.load(fooform.getmodelobject().getid()); setresponsepage(new foopage(foo, pagetype.edit)); } }; add(editbutton); // stuff here makes save button invisible in read_only, , edit visible in read_only // delete button similar (visible in create) } }
the dependency fields should not marked transient
, should serialized along page. wicket-spring
module injects serializable proxies @springbean
-annotated fields @ component/page creation time, can safely serialized, without worry serializing dependencies themselves.
Comments
Post a Comment