Hi, I'm currently trying to create a form using a loop, and I encountered some problems on the submit of my form.
So here's my procedure: - if the List is null, creation of a List (in onActivate()) of CheckText (a wrapper containing three fields: id, text and ticked). - in the .tml, the loop in the form loops on the list, and the currentText.ticked is used to set the checkbox - when I submit, all the checkboxes are verified and if one is not, an error is displayed I got an encoder, which is declared in AppModule.java Here are my sources: TestList.java : public class TestList { @Inject private AlertManager alertManager; @Persist @Property private List<CheckText> list; @Property private CheckText currentText; @InjectComponent private Form form; @OnEvent(value = EventConstants.ACTIVATE) public void initOnActivate() { if (list == null) { list = new ArrayList<>(); CheckText newtext; for (int i = 0; i < 5; i++) { newtext = new CheckText(); newtext.setId(i); newtext.setText("Test n°" + i); newtext.setTicked(false); list.add(newtext); } } } @OnEvent(value = EventConstants.SUCCESS) public void submit() { for (CheckText text : list) { if (!text.isTicked()) { form.recordError("Error on " + text.getText()); } } } public Object onSuccessFromForm() { alertManager.alert(Duration.SINGLE, Severity.INFO, "Yee haa"); return null; } } TestList.tml: <t:alerts/> <t:form t:id="form"> <t:errors/> <t:loop t:source="list" t:value="currentText"> <t:checkbox t:id="textToCheck" t:value="currentText.ticked" label="prop:currentText.text" /> <t:label for="textToCheck" /> <br/> </t:loop> <t:submit t:id="submitCheck"/> </t:form> CheckTextEncoder.java: public class CheckTextEncoder implements ValueEncoder<CheckText>, ValueEncoderFactory<CheckText> { private Map<Long, CheckText> values; public CheckTextEncoder() { values = new HashMap<>(); } @Override public ValueEncoder<CheckText> create(Class<CheckText> type) { return this; } @Override public String toClient(CheckTextvalue) { Long id = value.getId(); values.put(id, value); return String.valueOf(id); } @Override public CheckText toValue(String clientValue) { return values.get(clientValue); } } My problem is on the submit : I got a NPE on currentText, and I really don't understand how can there be one. Here's the full stack : ERROR][01/10/2013 16:21:51][org.apache.tapestry5.ioc.Registry] (OperationTrackerImpl.java:log:127) Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. [ERROR][01/10/2013 16:21:51][org.apache.tapestry5.ioc.Registry] (OperationTrackerImpl.java:log:128) Operations trace: [ERROR][01/10/2013 16:21:51][org.apache.tapestry5.ioc.Registry] (OperationTrackerImpl.java:log:137) [ 1] Triggering event 'action' on TestList:form [ERROR][01/10/2013 16:21:52][org.apache.tapestry5.services.TapestryModule.RequestExceptionHandler] (DefaultRequestExceptionHandler.java:handleRequestException:63) Processing of request failed with uncaught exception: Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. org.apache.tapestry5.ioc.internal.OperationException: Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.logAndRethrow(OperationTrackerImpl.java:121) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:88) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.PerThreadOperationTracker.invoke(PerThreadOperationTracker.java:87) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.RegistryImpl.invoke(RegistryImpl.java:1124) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementResourcesImpl.invoke(ComponentPageElementResourcesImpl.java:146) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.triggerContextEvent(ComponentPageElementImpl.java:1058) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.services.ComponentEventRequestHandlerImpl.handle(ComponentEventRequestHandlerImpl.java:81) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.services.ImmediateActionRenderResponseFilter.handle(ImmediateActionRenderResponseFilter.java:42) ~[tapestry-core-5.3.7.jar:na] at $ComponentEventRequestHandler_664af085b354.handle(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.AjaxFilter.handle(AjaxFilter.java:42) ~[tapestry-core-5.3.7.jar:na] at $ComponentEventRequestHandler_664af085b354.handle(Unknown Source) ~[na:na] at org.apache.tapestry5.upload.internal.services.UploadExceptionFilter.handle(UploadExceptionFilter.java:75) ~[tapestry-upload-5.3.7.jar:na] at $ComponentEventRequestHandler_664af085b354.handle(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$41.handle(TapestryModule.java:2476) ~[tapestry-core-5.3.7.jar:na] at $ComponentEventRequestHandler_664af085b354.handle(Unknown Source) ~[na:na] at $ComponentEventRequestHandler_664af085b320.handle(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.ComponentRequestHandlerTerminator.handleComponentEvent(ComponentRequestHandlerTerminator.java:43) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.services.InitializeActivePageName.handleComponentEvent(InitializeActivePageName.java:39) ~[tapestry-core-5.3.7.jar:na] at $ComponentRequestHandler_664af085b322.handleComponentEvent(Unknown Source) ~[na:na] at $ComponentRequestHandler_664af085b2e4.handleComponentEvent(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:46) ~[tapestry-core-5.3.7.jar:na] at $Dispatcher_664af085b2e8.dispatch(Unknown Source) ~[na:na] at $Dispatcher_664af085b2e1.dispatch(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:302) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) ~[tapestry-core-5.3.7.jar:na] at $RequestHandler_664af085b2e2.service(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902) ~[tapestry-core-5.3.7.jar:na] at $RequestHandler_664af085b2e2.service(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892) ~[tapestry-core-5.3.7.jar:na] at $RequestHandler_664af085b2e2.service(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90) ~[tapestry-core-5.3.7.jar:na] at $RequestHandler_664af085b2e2.service(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:105) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:95) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:85) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:119) ~[tapestry-core-5.3.7.jar:na] at $RequestHandler_664af085b2e2.service(Unknown Source) ~[na:na] at $RequestHandler_664af085b2d6.service(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$HttpServletRequestHandlerTerminator.service(TapestryModule.java:253) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44) ~[tapestry-upload-5.3.7.jar:na] at $HttpServletRequestHandler_664af085b2d8.service(Unknown Source) ~[na:na] at org.got5.tapestry5.jquery.services.AjaxUploadServletRequestFilter.service(AjaxUploadServletRequestFilter.java:27) ~[tapestry5-jquery-3.3.7.jar:na] at $HttpServletRequestHandler_664af085b2d8.service(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.gzip.GZipFilter.service(GZipFilter.java:53) ~[tapestry-core-5.3.7.jar:na] at $HttpServletRequestHandler_664af085b2d8.service(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) ~[tapestry-core-5.3.7.jar:na] at $HttpServletRequestFilter_664af085b2d2.service(Unknown Source) ~[na:na] at $HttpServletRequestHandler_664af085b2d8.service(Unknown Source) ~[na:na] at org.apache.tapestry5.services.TapestryModule$1.service(TapestryModule.java:852) ~[tapestry-core-5.3.7.jar:na] at $HttpServletRequestHandler_664af085b2d8.service(Unknown Source) ~[na:na] at $HttpServletRequestHandler_664af085b2d1.service(Unknown Source) ~[na:na] at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:171) ~[tapestry-core-5.3.7.jar:na] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) ~[catalina.jar:7.0.12] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) ~[catalina.jar:7.0.12] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) ~[catalina.jar:7.0.12] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) ~[catalina.jar:7.0.12] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) ~[catalina.jar:7.0.12] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) ~[catalina.jar:7.0.12] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) ~[catalina.jar:7.0.12] at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) ~[catalina.jar:7.0.12] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) ~[catalina.jar:7.0.12] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) ~[catalina.jar:7.0.12] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) ~[tomcat-coyote.jar:7.0.12] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) ~[tomcat-coyote.jar:7.0.12] at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) ~[tomcat-coyote.jar:7.0.12] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25] at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25] Caused by: org.apache.tapestry5.runtime.ComponentEventException: Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1141) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.access$3100(ComponentPageElementImpl.java:61) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1062) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl$5.invoke(ComponentPageElementImpl.java:1059) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.OperationTrackerImpl.invoke(OperationTrackerImpl.java:74) ~[tapestry-ioc-5.3.7.jar:na] ... 66 common frames omitted Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:689) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Form.advised$onAction_664af085b35b(Form.java:539) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Form$Invocation_onAction_664af085b35a.proceedToAdvisedMethod(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:84) ~[plastic-5.3.7.jar:na] at org.apache.tapestry5.ioc.internal.services.LoggingAdvice.advise(LoggingAdvice.java:37) ~[tapestry-ioc-5.3.7.jar:na] at org.apache.tapestry5.internal.plastic.AbstractMethodInvocation.proceed(AbstractMethodInvocation.java:86) ~[plastic-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Form.onAction(Form.java) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Form.dispatchComponentEvent(Form.java) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.dispatchEvent(ComponentPageElementImpl.java:940) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.structure.ComponentPageElementImpl.processEventTriggering(ComponentPageElementImpl.java:1117) ~[tapestry-core-5.3.7.jar:na] ... 70 common frames omitted Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Failure writing parameter 'value' of component TestList:textToCheck: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.writeToBinding(ParameterWorker.java:301) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.set(ParameterWorker.java:245) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Checkbox.conduit_set_value(Checkbox.java) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Checkbox.processSubmission(Checkbox.java:88) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.base.AbstractField.processSubmission(AbstractField.java:193) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.base.AbstractField.access$100(AbstractField.java:37) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.base.AbstractField$ProcessSubmission.execute(AbstractField.java:95) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.base.AbstractField$ProcessSubmission.execute(AbstractField.java:89) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.corelib.components.Form.executeStoredActions(Form.java:678) ~[tapestry-core-5.3.7.jar:na] ... 79 common frames omitted Caused by: org.apache.tapestry5.ioc.internal.util.TapestryException: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.internal.bindings.PropBinding.set(PropBinding.java:76) ~[tapestry-core-5.3.7.jar:na] at org.apache.tapestry5.internal.transform.ParameterWorker$3$1.writeToBinding(ParameterWorker.java:298) ~[tapestry-core-5.3.7.jar:na] ... 87 common frames omitted Caused by: java.lang.NullPointerException: Property 'currentText' (within property expression 'currentText.ticked', of net.adrien.test.TestList@41b7c08e) is null. at org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.nullTerm(PropertyConduitSourceImpl.java:1537) ~[tapestry-core-5.3.7.jar:na] at $InternalPropertyConduit_664af085b38b.navigate(Unknown Source) ~[na:na] at $InternalPropertyConduit_664af085b38b.set(Unknown Source) ~[na:na] at org.apache.tapestry5.internal.bindings.PropBinding.set(PropBinding.java:72) ~[tapestry-core-5.3.7.jar:na] ... 88 common frames omitted Thank you for your time and your help. Regards, Adrien