Hi Thiago, This component is some ui that we extract from few common pages. It shows a series of tabs. Each tabs has its own related Hibernate Entity. We don't pass all the tabs entity as parameter to the component. Instead we just pass the root component and let the rest of the tab get their entity from the DAO injected to the component.
The component is encapsulated inside of a form. It works well showing the data for each tab. But when we submit the form we receive that error. Since the tabs Hibernate Entity is not Persist in the component. Our approach is to use @Persist only when we have to. Usually this is handled in the page by populating the tabs Hibernate Entities in the page OnPrepare method. Translating this approach from a page implementation to the custom component isn't as straight forward as I thought. Since OnPrepare isn't called in the custom component. (it's part of page life cycle but not part of component rendering lifecycle?) Tried to implement it using Process Submission example from jumpstart (since it seems that's how you implement a component that contribute the value to form submission process). But still haven't got it working yet. By the way. Is it common to have @Persist property inside of a component? How do you clean the persisted field after submission? Is it enough only by calling ComponentResources.discardPersistentField() on the page OnSucces method? Or do we need to clean it up on the Component Java code instead? Sorry if the explanation a bit long and confusing. Thanks. On Thu, Nov 1, 2018 at 8:41 PM Thiago H. de Paula Figueiredo < thiag...@gmail.com> wrote: > 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 > -- http://www.mreunionlabs.net/ <http://www.mreunion-labs.net/> twitter : @mreunionlabs @abangkis page : https://plus.google.com/104168782385184990771