{"record":{"id":"ef98eaf6290a1ba0","repo":"Activiti/Activiti","slug":"transactionmanager-is-required-property-for-jtapro","errorCode":null,"errorMessage":"transactionManager is required property for JtaProcessEngineConfiguration, use  otherwise","messagePattern":"transactionManager is required property for JtaProcessEngineConfiguration, use  otherwise","errorType":"exception","errorClass":"ActivitiException","httpStatus":null,"severity":"critical","filePath":"activiti-core/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/JtaProcessEngineConfiguration.java","lineNumber":38,"sourceCode":"import org.activiti.engine.impl.cfg.jta.JtaTransactionContextFactory;\nimport org.activiti.engine.impl.interceptor.CommandInterceptor;\nimport org.activiti.engine.impl.interceptor.JtaTransactionInterceptor;\n\n/**\n\n */\npublic class JtaProcessEngineConfiguration extends ProcessEngineConfigurationImpl {\n\n    protected TransactionManager transactionManager;\n\n    public JtaProcessEngineConfiguration() {\n        this.transactionsExternallyManaged = true;\n    }\n\n    @Override\n    public CommandInterceptor createTransactionInterceptor() {\n        if (transactionManager == null) {\n            throw new ActivitiException(\n                \"transactionManager is required property for JtaProcessEngineConfiguration, use \" +\n                StandaloneProcessEngineConfiguration.class.getName() +\n                \" otherwise\"\n            );\n        }\n\n        return new JtaTransactionInterceptor(transactionManager);\n    }\n\n    @Override\n    public void initTransactionContextFactory() {\n        if (transactionContextFactory == null) {\n            transactionContextFactory = new JtaTransactionContextFactory(transactionManager);\n        }\n    }\n\n    public TransactionManager getTransactionManager() {\n        return transactionManager;","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/Activiti/Activiti/blob/56435b1a97deeafdc09dd40074b056c89fba5a8a/activiti-core/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/JtaProcessEngineConfiguration.java#L20-L56","documentation":"JtaProcessEngineConfiguration expects an external JTA transaction manager to be injected. createTransactionInterceptor runs during engine bootstrap; if the transactionManager property is null the configuration cannot build the interceptor and throws, suggesting StandaloneProcessEngineConfiguration for setups without a JTA container.","triggerScenarios":"Building a process engine with JtaProcessEngineConfiguration (or the spring-boot/jta variants) and calling buildProcessEngine() without having called setTransactionManager(TransactionManager).","commonSituations":"Deploying inside an app server (WildFly, WebSphere) but forgetting to look up/inject the UserTransaction/TransactionManager; running in a plain JVM/standalone test where a JTA config was copied from an app-server project; switching from Spring-managed local transactions to JTA without rewiring the property.","solutions":["Set the JTA transaction manager before building: cfg.setTransactionManager(transactionManager) (obtained via JNDI lookup of java:/TransactionManager or injected by your container).","If you don't need JTA, switch to StandaloneProcessEngineConfiguration (or SpringProcessEngineConfiguration with Spring transaction integration) as the message suggests.","Ensure the transactionManager field isn't being overwritten/reset by a subclass or Spring property binding after configuration."],"exampleFix":"// before\nJtaProcessEngineConfiguration cfg = new JtaProcessEngineConfiguration();\ncfg.setDataSource(ds);\nProcessEngine engine = cfg.buildProcessEngine(); // throws\n// after\nJtaProcessEngineConfiguration cfg = new JtaProcessEngineConfiguration();\ncfg.setDataSource(ds);\ncfg.setTransactionManager((TransactionManager) new InitialContext().lookup(\"java:/TransactionManager\"));\nProcessEngine engine = cfg.buildProcessEngine();","handlingStrategy":"validation","validationCode":"if (cfg instanceof JtaProcessEngineConfiguration\n    && ((JtaProcessEngineConfiguration) cfg).getTransactionManager() == null) {\n    throw new IllegalStateException(\"JtaProcessEngineConfiguration requires setTransactionManager(...)\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    engine = cfg.buildProcessEngine();\n} catch (ActivitiException e) {\n    if (e.getMessage().startsWith(\"transactionManager is required\")) {\n        throw new IllegalStateException(\"Configure a JTA TransactionManager or switch to StandaloneProcessEngineConfiguration\", e);\n    }\n    throw e;\n}","preventionTips":["Assert transactionManager presence in a configuration unit test before deploying","Use StandaloneProcessEngineConfiguration unless you truly run inside a JTA container","Centralize engine configuration in one factory class so JTA wiring can't be forgotten"],"tags":["activiti","jta","transaction","configuration"],"backgroundTag":"missing-required-config-field","analyzedSha":"56435b1a97deeafdc09dd40074b056c89fba5a8a","analyzedAt":"2026-09-09T21:00:06.703Z","contentChangedAt":"2026-09-09T21:00:06.703Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}