How to re-load entity edit screen data (changed in background) by EntityChangedEvent?

When (2) line commented then (1) line getEditedEntityLoader().load() works fine and both log messages from onClientChangedEvent method appear in the log.
When (1) line commented then (2) line do nothing and only first log message from onClientChangedEvent method appear in the log. No any errors.
Other (additional) loaders of the screen loads good.
Problem only with getEditedEntityLoader().

@Component("test_ClientEventListener")
public class ClientEventListener {

    private final UiEventPublisher uiEventPublisher;

    public ClientEventListener(UiEventPublisher uiEventPublisher) {
        this.uiEventPublisher = uiEventPublisher;
    }

    @TransactionalEventListener
    public void onClientChangedAfterCommit(EntityChangedEvent<Client> event) {
        uiEventPublisher.publishEvent(new ClientChangedEvent(event.getSource()));
    }
}
@UiController("test_Client.edit")
@UiDescriptor("client-edit.xml")
@EditedEntityContainer("clientDc")
public class ClientEdit extends StandardEditor<Client> {
    private static final Logger log = LoggerFactory.getLogger(ClientEdit.class);
    @Autowired
    private DataManager dataManager;
    @Autowired
    private TimeSource timeSource;

    @Subscribe("backgroundSaveBtn")
    public void onBackgroundSaveBtnClick(Button.ClickEvent event) {
        var client = dataManager.load(Client.class).id(getEditedEntity().getId()).one();
        client.setFirstName(timeSource.now().toString());
        dataManager.save(client);
        getEditedEntityLoader().load(); // (1)
    }

    @EventListener
    private void onClientChangedEvent(ClientChangedEvent event) {
        log.debug("ClientChangedEvent listener started");
        getEditedEntityLoader().load();  // (2)
        log.debug("ClientChangedEvent listener finished");
    }
}
``

Most probably an exception occurs in the “after commit” entity listener, but it’s not logged or shown. It’s mentioned in the docs:

Note that exceptions occurred in an “after commit” event listener are not propagated to the calling code and not logged. So it is recommended to wrap your code in the try-catch clause.

Let’s start from looking at what actually happens.

@TransactionalEventListener
    public void onClientChangedAfterCommit(EntityChangedEvent<Client> event) {
        try {
            uiEventPublisher.publishEvent(new ClientChangedEvent(event.getSource()));
        } catch (Exception e) {
            log.error("Error handling Client changes after commit", e);
        }    }

Really provide me with error in log:

javax.persistence.TransactionRequiredException: 
Exception Description: No transaction is currently active
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.throwCheckTransactionFailedException(EntityTransactionWrapper.java:89) ~[org.eclipse.persistence.jpa-2.7.9-6-jmix.jar:na]
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.checkForTransaction(EntityTransactionWrapper.java:52) ~[org.eclipse.persistence.jpa-2.7.9-6-jmix.jar:na]
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:2200) ~[org.eclipse.persistence.jpa-2.7.9-6-jmix.jar:na]
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:979) ~[org.eclipse.persistence.jpa-2.7.9-6-jmix.jar:na]
	at io.jmix.eclipselink.impl.EclipselinkPersistenceSupport$ContainerResourceSynchronization.detachAll(EclipselinkPersistenceSupport.java:599) ~[jmix-eclipselink-1.4.4.jar:na]
	at io.jmix.eclipselink.impl.EclipselinkPersistenceSupport$ContainerResourceSynchronization.beforeCommit(EclipselinkPersistenceSupport.java:554) ~[jmix-eclipselink-1.4.4.jar:na]
	at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:97) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:916) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:727) ~[spring-tx-5.3.24.jar:5.3.24]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) ~[spring-tx-5.3.24.jar:5.3.24]
	at io.jmix.eclipselink.impl.JpaDataStore.commitTransaction(JpaDataStore.java:395) ~[jmix-eclipselink-1.4.4.jar:na]
	at io.jmix.core.datastore.AbstractDataStore.load(AbstractDataStore.java:95) ~[jmix-core-1.4.4.jar:na]
	at io.jmix.core.impl.UnconstrainedDataManagerImpl.load(UnconstrainedDataManagerImpl.java:97) ~[jmix-core-1.4.4.jar:na]
	at io.jmix.ui.model.impl.InstanceLoaderImpl.load(InstanceLoaderImpl.java:91) ~[jmix-ui-1.4.4.jar:na]
	at com.company.test1.screen.client.ClientEdit.onClientChangedEvent(ClientEdit.java:42) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
.....
.....

Similar problem on the forum (@TransactionalEventListener causing error “No transaction is currently active”) give me solution:

    @Transactional
    @TransactionalEventListener
    public void onClientChangedAfterCommit(EntityChangedEvent<Client> event) {
    .....
    }
1 Like