{"record":{"id":"d46bd32283f538c3","repo":"flowable/flowable-engine","slug":"transactionmanager-is-required-property-for-jtapro-d46bd3","errorCode":null,"errorMessage":"transactionManager is required property for JtaProcessEngineConfiguration, use org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration otherwise","messagePattern":"transactionManager is required property for JtaProcessEngineConfiguration, use org\\.activiti\\.engine\\.impl\\.cfg\\.StandaloneProcessEngineConfiguration otherwise","errorType":"exception","errorClass":"ActivitiException","httpStatus":null,"severity":"critical","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cfg/JtaProcessEngineConfiguration.java","lineNumber":36,"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 * @author Tom Baeyens\n */\npublic class JtaProcessEngineConfiguration extends ProcessEngineConfigurationImpl {\n\n    protected TransactionManager transactionManager;\n\n    public JtaProcessEngineConfiguration() {\n        this.transactionsExternallyManaged = true;\n    }\n\n    @Override\n    protected CommandInterceptor createTransactionInterceptor() {\n        if (transactionManager == null) {\n            throw new ActivitiException(\"transactionManager is required property for JtaProcessEngineConfiguration, use \" + StandaloneProcessEngineConfiguration.class.getName() + \" otherwise\");\n        }\n\n        return new JtaTransactionInterceptor(transactionManager);\n    }\n\n    @Override\n    protected void initTransactionContextFactory() {\n        if (transactionContextFactory == null) {\n            transactionContextFactory = new JtaTransactionContextFactory(transactionManager);\n        }\n    }\n\n    public TransactionManager getTransactionManager() {\n        return transactionManager;\n    }\n\n    public void setTransactionManager(TransactionManager transactionManager) {\n        this.transactionManager = transactionManager;","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/cfg/JtaProcessEngineConfiguration.java#L18-L54","documentation":"JtaProcessEngineConfiguration requires a JTA transactionManager to build its transaction interceptor. If createTransactionInterceptor runs with transactionManager still null, the engine throws this ActivitiException because JTA-managed transactions are impossible without one. The message points to StandaloneProcessEngineConfiguration as the alternative for non-JTA setups.","triggerScenarios":"Building a process engine from a JtaProcessEngineConfiguration (or its Spring/CDI subclasses) without calling setTransactionManager before processEngine build; createTransactionInterceptor is invoked during engine initialization.","commonSituations":"Migrating a standalone Activiti config to JTA in an app server and forgetting the JTA TransactionManager bean; using JtaProcessEngineConfiguration outside a container that provides javax.transaction.TransactionManager; Spring wiring where the transactionManager bean isn't injected.","solutions":["Set the JTA transaction manager: configuration.setTransactionManager(transactionManager) before buildProcessEngine()","If not running in a JTA environment, switch to StandaloneProcessEngineConfiguration (or StandaloneInMemProcessEngineConfiguration for tests)","In Spring, ensure the JtaTransactionManager bean is injected into the configuration factory bean"],"exampleFix":"// before\nJtaProcessEngineConfiguration cfg = new JtaProcessEngineConfiguration();\ncfg.buildProcessEngine(); // throws\n// after\nJtaProcessEngineConfiguration cfg = new JtaProcessEngineConfiguration();\ncfg.setTransactionManager(jtaTransactionManager);\ncfg.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  processEngine = cfg.buildProcessEngine();\n} catch (ActivitiException e) {\n  if (e.getMessage().contains(\"transactionManager is required\")) {\n    throw new ConfigurationException(\"Provide a JTA TransactionManager or use StandaloneProcessEngineConfiguration\", e);\n  } else throw e;\n}","preventionTips":["Always call setTransactionManager before buildProcessEngine on JTA configs","Use StandaloneProcessEngineConfiguration when not in a JTA container","In Spring, wire JtaTransactionManager into the engine factory bean","Boot-strap config in one place and assert required fields early"],"tags":["activiti","configuration","jta","transaction"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}