[ https://issues.apache.org/jira/browse/CAUSEWAY-3687?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andi Huber updated CAUSEWAY-3687: --------------------------------- Summary: [Validation] Disallow @Transactional within @DomainService(nature=VIEW) (was: Using @Transactional within a @DomainService Leads to a Missing Menu Entry) > [Validation] Disallow @Transactional within @DomainService(nature=VIEW) > ----------------------------------------------------------------------- > > Key: CAUSEWAY-3687 > URL: https://issues.apache.org/jira/browse/CAUSEWAY-3687 > Project: Causeway > Issue Type: Improvement > Components: Viewer Wicket > Affects Versions: 2.0.0-RC4 > Reporter: Jörg Rade > Assignee: Andi Huber > Priority: Major > Fix For: 2.0.0-RC5 > > 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)