Hai guys, still working on my custom component. How do we let our custom component participate in form submission. Apparently there is no onPrepare hook for tapestry custom component. http://tapestry.apache.org/component-rendering.html.
I'm reading http://jumpstart.doublenegative.com.au/jumpstart/examples/component/subformvalidation1 example. But still haven't grasp the general gist about ProcessSubmission/ComponentAction. Calling the prepare method from process submission doesn't seems to work. Rendering the component is fine, but when submitting the page I receive the error and stack trace bellow. Any advice? Thanks. Here's my custom component setup & prepare method: private static final ProcessSubmission PROCESS_SUBMISSION = new ProcessSubmission(); // Tapestry calls afterRender() AFTER it renders any components I contain (ie. Loop). final void afterRender() { // If we are inside a form, ask FormSupport to store PROCESS_SUBMISSION in its list of actions to do on submit. // If I contain other components, their actions will already be in the list, before PROCESS_SUBMISSION. That is // because this method, afterRender(), is late in the sequence. This guarantees PROCESS_SUBMISSION will be // executed on submit AFTER the components I contain are processed (which includes their validation). if (formSupport != null) { formSupport.store(this, PROCESS_SUBMISSION); } } private static class ProcessSubmission implements ComponentAction<LoanBundleEditTabs2> { private static final long serialVersionUID = -2132279249191788845L; @Override public String toString() { return this.getClass().getSimpleName() + ".ProcessSubmission"; } @Override public void execute(LoanBundleEditTabs2 component) { component.processSubmission(); } } private void processSubmission() { // Validate. We ensured in afterRender() that the components I contain have already been validated. prepare(); } @SetupRender void setup() { prepare(); } void prepare() { Long loanApplicationId = loanApplication.getId(); loanApplicationDetail = loanApplicationDetailDao.getByApplicationId(loanApplicationId); homeAddress = loanAddressDao.getHomeAddressByApplicationId(loanApplicationId); homeAddress2 = new AddressModel(); addressCopier.copy(homeAddress, homeAddress2); mailAddress = loanAddressDao.getMailAddressByApplicationId(loanApplicationId); mailAddress2 = new AddressModel(); addressCopier.copy(mailAddress, mailAddress2); officeAddress = loanAddressDao.getOfficeAddressByApplicationId(loanApplicationId); officeAddress2 = new AddressModel(); addressCopier.copy(officeAddress, officeAddress2); } Here's the stack trace [ERROR] ioc.Registry Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [ERROR] ioc.Registry Operations trace: [ERROR] ioc.Registry [ 1] Handling traditional 'action' component event request for common/loan/ApplicationSummary:form. [ERROR] ioc.Registry [ 2] Triggering event 'action' on common/loan/ApplicationSummary:form [ERROR] TapestryModule.RequestExceptionHandler Processing of request failed with uncaught exception: org.apache.tapestry5.ioc.internal.OperationException: Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:net/mreunionlabs/gri/server/pages/common/loan/LoanApplicationSummary.tml, line 63] org.apache.tapestry5.ioc.internal.OperationException: Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:net/mreunionlabs/gri/server/pages/common/loan/LoanApplicationSummary.tml, line 63] at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:186) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:90) at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:72) at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1260) at org.apache.tapestry5.internal.structure.ComponentPageElementResourcesImpl.invoke(ComponentPageElementResourcesImpl.java:154) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.triggerContextEvent(ComponentPageElementImpl.java:1043) at org.apache.tapestry5.internal.services.ComponentEventRequestHandlerImpl.handle(ComponentEventRequestHandlerImpl.java:73) at org.apache.tapestry5.internal.services.AjaxFilter.handle(AjaxFilter.java:42) at $ComponentEventRequestHandler_47d6beafe399.handle(Unknown Source) at org.apache.tapestry5.upload.internal.services.UploadExceptionFilter.handle(UploadExceptionFilter.java:76) at $ComponentEventRequestHandler_47d6beafe399.handle(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$37.handle(TapestryModule.java:2216) at $ComponentEventRequestHandler_47d6beafe399.handle(Unknown Source) at $ComponentEventRequestHandler_47d6beafe27e.handle(Unknown Source) at org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handleComponentEvent(ComponentRequestHandlerTerminator.java:43) at org.apache.tapestry5.internal.services.DeferredResponseRenderer.handleComponentEvent(DeferredResponseRenderer.java:45) at $ComponentRequestHandler_47d6beafe280.handleComponentEvent(Unknown Source) at org.apache.tapestry5.services.InitializeActivePageName.handleComponentEvent(InitializeActivePageName.java:39) at $ComponentRequestHandler_47d6beafe280.handleComponentEvent(Unknown Source) at org.apache.tapestry5.internal.services.RequestOperationTracker$1.perform(RequestOperationTracker.java:55) at org.apache.tapestry5.internal.services.RequestOperationTracker$1.perform(RequestOperationTracker.java:52) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.perform(OperationTrackerImpl.java:110) at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.perform(PerThreadOperationTracker.java:84) at org.apache.tapestry5.ioc.internal.RegistryImpl.perform(RegistryImpl.java:1266) at org.apache.tapestry5.internal.services.RequestOperationTracker.handleComponentEvent(RequestOperationTracker.java:47) at $ComponentRequestHandler_47d6beafe280.handleComponentEvent(Unknown Source) at net.mreunionlabs.gri.server.infrastructure.PageProtectionFilter.handleComponentEvent(PageProtectionFilter.java:60) at $ComponentRequestFilter_47d6beafe27d.handleComponentEvent(Unknown Source) at $ComponentRequestHandler_47d6beafe280.handleComponentEvent(Unknown Source) at $ComponentRequestHandler_47d6beafe236.handleComponentEvent(Unknown Source) at org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:48) at $Dispatcher_47d6beafe238.dispatch(Unknown Source) at $Dispatcher_47d6beafe22d.dispatch(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:305) at org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) at $RequestHandler_47d6beafe22e.service(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$3.service(TapestryModule.java:846) at $RequestHandler_47d6beafe22e.service(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$2.service(TapestryModule.java:836) at $RequestHandler_47d6beafe22e.service(Unknown Source) at org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:89) at $RequestHandler_47d6beafe22e.service(Unknown Source) at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:105) at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:95) at org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:83) at org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:119) at $RequestHandler_47d6beafe22e.service(Unknown Source) at $RequestHandler_47d6beafe223.service(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:256) at org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:45) at $HttpServletRequestHandler_47d6beafe225.service(Unknown Source) at org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:59) at $HttpServletRequestHandler_47d6beafe225.service(Unknown Source) at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) at $HttpServletRequestFilter_47d6beafe21f.service(Unknown Source) at $HttpServletRequestHandler_47d6beafe225.service(Unknown Source) at org.apache.tapestry5.modules.TapestryModule$1.service(TapestryModule.java:796) at $HttpServletRequestHandler_47d6beafe225.service(Unknown Source) at $HttpServletRequestHandler_47d6beafe21e.service(Unknown Source) at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:166) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1629) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) at org.eclipse.jetty.server.Server.handle(Server.java:564) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110) at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124) at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128) at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:673) at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:591) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.tapestry5.runtime.ComponentEventException: Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:net/mreunionlabs/gri/server/pages/common/loan/LoanApplicationSummary.tml, line 63] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1126) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.access$3100(ComponentPageElementImpl.java:57) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1047) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1044) at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:82) ... 89 more Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:org/apache/tapestry5/corelib/components/BeanDisplay.tml, line 3] at org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:749) at org.apache.tapestry5.corelib.components.Form.onAction(Form.java:516) at org.apache.tapestry5.corelib.components.Form.dispatchComponentEvent(Form.java) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.dispatchEvent(ComponentPageElementImpl.java:917) at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1102) ... 93 more Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Failure reading parameter 'source' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0.loop: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:org/apache/tapestry5/corelib/components/BeanDisplay.tml, line 3] at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.readFromBinding(ParameterWorker.java:268) at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.get(ParameterWorker.java:381) at org.apache.tapestry5.corelib.components.Loop.conduit_get_source(Loop.java) at org.apache.tapestry5.corelib.components.Loop.setupForVolatile(Loop.java:356) at org.apache.tapestry5.corelib.components.Loop.access$100(Loop.java:50) at org.apache.tapestry5.corelib.components.Loop$2.execute(Loop.java:81) at org.apache.tapestry5.corelib.components.Loop$2.execute(Loop.java:76) at org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:738) ... 97 more Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:org/apache/tapestry5/corelib/components/BeanDisplay.tml, line 3] at org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:67) at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.readFromBinding(ParameterWorker.java:263) ... 104 more Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Parameter 'object' of component common/loan/ApplicationSummary:loanbundleedittabs2.beandisplay_0 is bound to null. This parameter is not allowed to be null. [at classpath:net/mreunionlabs/gri/server/components/gri/LoanBundleEditTabs2.tml, line 67] at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.readFromBinding(ParameterWorker.java:276) at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.get(ParameterWorker.java:381) at org.apache.tapestry5.corelib.components.BeanDisplay.conduit_get_object(BeanDisplay.java) at org.apache.tapestry5.corelib.components.BeanDisplay.getModel(BeanDisplay.java:128) at $InternalPropertyConduit_47d6beafe2e9.navigate(Unknown Source) at $InternalPropertyConduit_47d6beafe2e9.get(Unknown Source) at org.apache.tapestry5.internal.bindings.PropBinding.get(PropBinding.java:63) ... 105 more -- http://www.mreunionlabs.net/ <http://www.mreunion-labs.net/> twitter : @mreunionlabs @abangkis page : https://plus.google.com/104168782385184990771