I have a Java application that runs in Docker using Tomcat and Maven.
We are using docker-compose command to build/up the application. build
works fine, but when I do the up
an error is thrown:
appmanager-1 | Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [applicationContext-core-infrastructure.xml]: Failed to convert property value of type 'com.atomikos.icatch.jta.J2eeTransactionManager' to required type 'jakarta.transaction.TransactionManager' for property 'transactionManager'; Cannot convert value of type 'com.atomikos.icatch.jta.J2eeTransactionManager' to required type 'jakarta.transaction.TransactionManager' for property 'transactionManager': no matching editors or conversion strategy found
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607)
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522)
appmanager-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337)
appmanager-1 | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
appmanager-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335)
appmanager-1 | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
appmanager-1 | at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:365)
appmanager-1 | ... 126 more
appmanager-1 | Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'com.atomikos.icatch.jta.J2eeTransactionManager' to required type 'jakarta.transaction.TransactionManager' for property 'transactionManager'; Cannot convert value of type 'com.atomikos.icatch.jta.J2eeTransactionManager' to required type 'jakarta.transaction.TransactionManager' for property 'transactionManager': no matching editors or conversion strategy found
appmanager-1 | at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:595)
appmanager-1 | at org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:609)
appmanager-1 | at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:190)
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1747)
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1691)
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1436)
appmanager-1 | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599)
appmanager-1 | ... 132 more
appmanager-1 | Caused by: java.lang.IllegalStateException: Cannot convert value of type 'com.atomikos.icatch.jta.J2eeTransactionManager' to required type 'jakarta.transaction.TransactionManager' for property 'transactionManager': no matching editors or conversion strategy found
appmanager-1 | at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:273)
appmanager-1 | at org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:590)
appmanager-1 | ... 138 more
appmanager-1 | 31-Jul-2024 11:53:43.420 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
appmanager-1 | 31-Jul-2024 11:53:43.423 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
appmanager-1 | 31-Jul-2024 11:53:43.425 INFO [main] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
appmanager-1 | 31-Jul-2024 11:53:43.439 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [ROOT] registered the JDBC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
appmanager-1 | 31-Jul-2024 11:53:43.439 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [bitronix-task-scheduler] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
appmanager-1 | java.base/java.lang.Thread.sleep0(Native Method)
appmanager-1 | java.base/java.lang.Thread.sleep(Thread.java:509)
appmanager-1 | bitronix.tm.timer.TaskScheduler.run(TaskScheduler.java:245)
We use transaction manager XML configuration
<!-- Atomikos properties are set in jta.properties -->
<bean id="atomikosTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
init-method="init" destroy-method="shutdownWait">
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.J2eeTransactionManager" depends-on="atomikosTransactionService"/>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction"/>
<!-- Spring JtaTransactionManager -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
<property name="transactionManager" ref="atomikosTransactionManager"/>
<property name="userTransaction" ref="atomikosUserTransaction"/>
<property name="defaultTimeout" value="${jta.transaction.default.timeout}"/>
</bean>
The funny part is that the application works for my other 2 colleagues.
I tried to make sure that maven dependencies are fine in Docker container and I even used docker volume rm [volume-name]
and re-create everything, but it didn’t fix the problem.
I compared my colleague mvn dependencies from his Docker container with mine: Docker Desktop > click on container name > Exec Tab > write bash (you should be in Tomcat after) > cd webapps > cd ROOT > cd WEB-INF > cd lib > ls
and they are exactly the same.
In this old post https://fogbugz.atomikos.com/default3c36.html?community.6.3158.2 is suggested to look for another transaction jar that can cause conflicts. I’m trying to spot it.