[ https://issues.apache.org/jira/browse/CAUSEWAY-3687?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17818909#comment-17818909 ]
Jörg Rade commented on CAUSEWAY-3687: ------------------------------------- Reproduce with causeway-app-simpleapp (jpa): * add execute method to SimpleObjects: {code:java} @Transactional public SimpleObject execute(SimpleObject obj) { return obj; } {code} Invocation of Prototyping -> Run Fixture Script lead to: {code} java.lang.NullPointerException: Cannot invoke "org.apache.causeway.applib.services.repository.RepositoryService.persist(Object)" because "this.repositoryService" is null at domainapp.modules.simple.dom.so.SimpleObjects.create(SimpleObjects.java:43) ~[classes/:?] at domainapp.modules.simple.dom.so.SimpleObjects$$EnhancerBySpringCGLIB$$bab7c812.create(<generated>) ~[classes/:?] at domainapp.modules.simple.fixture.SimpleObject_persona$Builder.buildResult(SimpleObject_persona.java:64) ~[classes/:?] at domainapp.modules.simple.fixture.SimpleObject_persona$Builder.buildResult(SimpleObject_persona.java:56) ~[classes/:?] at org.apache.causeway.testing.fixtures.applib.personas.BuilderScriptWithResult.execute(BuilderScriptWithResult.java:49) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlreadyWithValueSemantics(FixtureScript.java:644) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:614) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:581) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:540) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.setup.PersonaEnumPersistAll.execute(PersonaEnumPersistAll.java:81) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlreadyWithValueSemantics(FixtureScript.java:644) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:614) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:581) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:540) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChild(FixtureScript.java:467) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at domainapp.webapp.application.fixture.scenarios.DomainAppDemo.execute(DomainAppDemo.java:15) ~[classes/:?] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:617) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScript.run(FixtureScript.java:803) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScripts.runFixtureScript(FixtureScripts.java:341) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScripts.runFixtureScript(FixtureScripts.java:327) ~[causeway-testing-fixtures-applib-2.0.0-RC3.jar:2.0.0-RC3] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?] at org.apache.causeway.commons.internal.reflection._Reflect.lambda$invokeMethodOn$13(_Reflect.java:577) ~[causeway-commons-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.commons.functional.Try.call(Try.java:58) ~[causeway-commons-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.commons.internal.reflection._Reflect.invokeMethodOn(_Reflect.java:575) ~[causeway-commons-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.commons.CanonicalInvoker.invoke(CanonicalInvoker.java:126) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.commons.CanonicalInvoker.invoke(CanonicalInvoker.java:114) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.commons.CanonicalInvoker.invoke(CanonicalInvoker.java:93) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.execution.ActionExecutor.invokeMethodElseFromCache(ActionExecutor.java:219) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.execution.ActionExecutor.executeWithoutEvents(ActionExecutor.java:187) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.execution.ActionExecutor.execute(ActionExecutor.java:167) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.execution.ActionExecutor.execute(ActionExecutor.java:58) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.interaction.session.CausewayInteraction.executeInternal(CausewayInteraction.java:136) ~[causeway-core-interaction-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.interaction.session.CausewayInteraction.execute(CausewayInteraction.java:109) ~[causeway-core-interaction-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.runtimeservices.executor.MemberExecutorServiceDefault.invokeActionInternally(MemberExecutorServiceDefault.java:169) ~[causeway-core-runtimeservices-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.runtimeservices.executor.MemberExecutorServiceDefault.lambda$invokeAction$1(MemberExecutorServiceDefault.java:125) ~[causeway-core-runtimeservices-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.commons.functional.Try.call(Try.java:58) ~[causeway-commons-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.runtimeservices.transaction.TransactionServiceSpring.callTransactional(TransactionServiceSpring.java:109) ~[causeway-core-runtimeservices-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.applib.services.xactn.TransactionalProcessor.callWithinCurrentTransactionElseCreateNew(TransactionalProcessor.java:100) ~[causeway-applib-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.runtimeservices.executor.MemberExecutorServiceDefault.invokeAction(MemberExecutorServiceDefault.java:124) ~[causeway-core-runtimeservices-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.execution.MemberExecutorService.invokeAction(MemberExecutorService.java:86) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForAction.invoke(ActionInvocationFacetForAction.java:56) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionDefault.executeInternal(ObjectActionDefault.java:465) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionDefault.execute(ObjectActionDefault.java:453) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.specloader.specimpl.ObjectActionDefault.executeWithRuleChecking(ObjectActionDefault.java:433) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.interactions.managed.ManagedAction.invokeWithRuleChecking(ManagedAction.java:156) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.core.metamodel.interactions.managed.ActionInteraction.invokeWithRuleChecking(ActionInteraction.java:157) ~[causeway-core-metamodel-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.viewer.wicket.model.models.ActionModelImpl.executeActionAndReturnResult(ActionModelImpl.java:135) ~[causeway-viewer-wicket-model-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.viewer.wicket.ui.panels.FormExecutorDefault.lambda$executeAndProcessResults$6(FormExecutorDefault.java:129) ~[causeway-viewer-wicket-ui-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.commons.functional.Either$Left.fold(Either.java:127) ~[causeway-commons-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.viewer.wicket.ui.panels.FormExecutorDefault.executeAndProcessResults(FormExecutorDefault.java:128) ~[causeway-viewer-wicket-ui-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.viewer.wicket.ui.panels.PromptFormAbstract.onOkSubmitted(PromptFormAbstract.java:122) ~[causeway-viewer-wicket-ui-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.causeway.viewer.wicket.ui.util.Wkt$5.onSubmit(Wkt.java:331) ~[causeway-viewer-wicket-ui-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:113) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$AjaxFormSubmitter.onSubmit(AjaxFormSubmitBehavior.java:249) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1372) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.markup.html.form.Form.process(Form.java:1034) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:858) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:202) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:154) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:630) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.core.request.handler.ListenerRequestHandler.internalInvoke(ListenerRequestHandler.java:300) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.core.request.handler.ListenerRequestHandler.invoke(ListenerRequestHandler.java:274) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.core.request.handler.ListenerRequestHandler.invokeListener(ListenerRequestHandler.java:222) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.core.request.handler.ListenerRequestHandler.respond(ListenerRequestHandler.java:202) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:910) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:63) ~[wicket-request-9.14.0.jar:9.14.0] at org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:294) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:255) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:277) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:208) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:307) ~[wicket-core-9.14.0.jar:9.14.0] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.causeway.core.webapp.modules.logonlog.CausewayLogOnExceptionFilter.doFilter(CausewayLogOnExceptionFilter.java:60) ~[causeway-core-webapp-2.0.0-RC3.jar:2.0.0-RC3] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.30.jar:5.3.30] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.30.jar:5.3.30] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.30.jar:5.3.30] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.30.jar:5.3.30] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.80.jar:9.0.80] at java.lang.Thread.run(Thread.java:833) ~[?:?] {code} > Using @Transactional within a @DomainService Leads to a Missing Menu Entry > -------------------------------------------------------------------------- > > Key: CAUSEWAY-3687 > URL: https://issues.apache.org/jira/browse/CAUSEWAY-3687 > Project: Causeway > Issue Type: Bug > Components: Viewer Wicket > Affects Versions: 2.0.0-RC4 > Reporter: Jörg Rade > Priority: Major > Attachments: screenshot-1.png > > > {code:java} > package com.kn.lx.domain; > import com.kn.lx.util.Constants; > import com.kn.lx.config.Properties; > import com.kn.lx.input.elastic.QueryResultItemTO; > import com.kn.lx.input.elastic.QueryService; > import com.kn.lx.input.elastic.pr.PrQuery; > import lombok.NonNull; > import lombok.RequiredArgsConstructor; > import org.apache.causeway.applib.annotation.Action; > import org.apache.causeway.applib.annotation.ActionLayout; > import org.apache.causeway.applib.annotation.DomainService; > import org.apache.causeway.applib.annotation.NatureOfService; > import org.apache.causeway.applib.annotation.Programmatic; > import org.apache.causeway.applib.annotation.SemanticsOf; > import org.springframework.transaction.annotation.Transactional; > import javax.inject.Inject; > import javax.inject.Named; > import java.lang.reflect.InvocationTargetException; > import java.time.LocalDateTime; > import java.util.List; > import java.util.Optional; > @Named("lx.Tasks") > @DomainService(nature = NatureOfService.VIEW) > @RequiredArgsConstructor(onConstructor_ = {@Inject}) > public class Tasks { > private final TaskRepository taskRepository; > private final QueryService queryService; > private final Executions executions; > private final Properties properties; > @Programmatic > public Task create(String className) { > final Task obj = new Task(); > obj.setQueryClassName(className); > obj.setCronExpression(Constants.INSTANCE.getEVERY_FIVE_MINUTES()); > obj.setActive(true); > taskRepository.saveAndFlush(obj); > return obj; > } > @ActionLayout(sequence = "1") > public List<Task> listAll() { > return taskRepository.findAll(); > } > public void init() { > createIfAbsent(PrQuery.class.getCanonicalName()); > } > @ActionLayout(sequence = "2") > public void createIfAbsent(final String name) { > final Task obj = taskRepository.findByQueryClassName(name); > if (null == obj) { > create(name); > } > } > @Action(semantics = SemanticsOf.SAFE) > @ActionLayout(sequence = "3", cssClassFa = "trash") > public void delete(Task task) { > taskRepository.delete(task); > } > List<QueryResultItemTO> executeQuery(PrQuery query) { > final Integer chunkSize = > properties.getInteger(Constants.INSTANCE.getELASTIC_QUERY_CHUNK_SIZE()); > query.setMaxNumberOfHits(chunkSize); > String latestTimeStamp = > properties.getString(Constants.INSTANCE.getEND_TIME_STAMP()); > if (latestTimeStamp.isEmpty()) { > latestTimeStamp = > properties.getString(Constants.INSTANCE.getSTART_TIME_STAMP()); > } > return queryService.searchBy(query, latestTimeStamp); > } > @NonNull PrQuery createForClass(String queryClassName) { > try { > return (PrQuery) > Class.forName(queryClassName).getDeclaredConstructor().newInstance(); > } catch (InstantiationException | > IllegalAccessException | > ClassNotFoundException | > InvocationTargetException | > NoSuchMethodException e) { > throw new RuntimeException(e); > } > } > @Transactional > public Task execute(Task argTask) { > final Task task = update(argTask); > if (task.isActive()) { > final PrQuery query = createForClass(task.getQueryClassName()); > final List<QueryResultItemTO> queryResultList = > executeQuery(query); > final Execution e = executions.create(task, queryResultList); > e.setEndedAt(LocalDateTime.now()); > e.setHits((long) queryResultList.size()); > task.getExecutionList().add(e); > taskRepository.saveAndFlush(task); > executions.sendMessagesFor(e); > return task; > } > return null; > } > /** > * It seems argTask is out of sync when it reaches this point. > * Read it again. > * > * @param argTask Task to be synced > * @return Task, synced with DB > */ > private Task update(Task argTask) { > final Optional<? extends Task> optionalTask = > taskRepository.findById(argTask.getId()); > if (optionalTask.isPresent()) { > return optionalTask.get(); > } else { > throw new RuntimeException("Task not found"); > } > } > } > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)