Hello! What exactly is this component trying to do? I couldn't get it by looking at your code snippet.
Anyway, the probably best way of doing it if you want to create a component which edits something is to subclass AbstractField. The error message says you're trying to pass a null object to BeanDisplay while it renders, so this doesn't seem to be a problem with form submission at all, but a problem while rendering the page later. 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 On Thu, Nov 1, 2018 at 4:43 AM abangkis <abang...@gmail.com> wrote: > 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 > -- Thiago