You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/04/07 09:41:13 UTC

[camel] 04/05: CAMEL-16834: error handler in model DSL. WIP

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit ce71c94ed402d92e24fb43d3198ded8e7afd0bda
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Apr 7 11:36:24 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../camel/jta/JtaTransactionErrorHandler.java      |  6 ++--
 .../jta/JtaTransactionErrorHandlerReifier.java     | 22 ++++++------
 .../org/apache/camel/jta/JtaTransactionPolicy.java | 20 +++++------
 .../camel/spring/spi/SpringTransactionPolicy.java  |  2 +-
 .../spring/spi/TransactionErrorHandlerReifier.java | 26 +++++++-------
 .../services/org/apache/camel/model.properties     |  3 +-
 .../org/apache/camel/model/errorHandler.json       |  2 +-
 .../org/apache/camel/model/errorhandler/jaxb.index |  3 +-
 ...andler.json => jtaTransactionErrorHandler.json} |  8 ++---
 ...ler.json => springTransactionErrorHandler.json} |  8 ++---
 .../apache/camel/model/ErrorHandlerDefinition.java |  6 ++--
 .../JtaTransactionErrorHandlerDefinition.java      | 41 ++++++++++++++++++++++
 .../SpringTransactionErrorHandlerDefinition.java   | 41 ++++++++++++++++++++++
 .../TransactionErrorHandlerDefinition.java         | 16 +--------
 .../java/org/apache/camel/xml/in/ModelParser.java  | 23 ++++++++----
 15 files changed, 153 insertions(+), 74 deletions(-)

diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
index 0d5259a87ae..68c8d66f4ee 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandler.java
@@ -24,7 +24,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
-import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.RedeliveryErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
@@ -42,9 +42,9 @@ public class JtaTransactionErrorHandler extends RedeliveryErrorHandler {
 
     static {
         // register camel-jta as transaction error handler
-        ErrorHandlerReifier.registerReifier(TransactionErrorHandlerDefinition.class,
+        ErrorHandlerReifier.registerReifier(JtaTransactionErrorHandlerDefinition.class,
                 (route, errorHandlerFactory) -> new JtaTransactionErrorHandlerReifier(
-                        route, (TransactionErrorHandlerDefinition) errorHandlerFactory));
+                        route, (JtaTransactionErrorHandlerDefinition) errorHandlerFactory));
     }
 
     private static final Logger LOG = LoggerFactory.getLogger(JtaTransactionErrorHandler.class);
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
index a49f867cfd3..7dfa4f2e0d5 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionErrorHandlerReifier.java
@@ -25,6 +25,7 @@ import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
@@ -32,18 +33,17 @@ import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ThreadPoolProfile;
-import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<TransactionErrorHandlerDefinition> {
+public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<JtaTransactionErrorHandlerDefinition> {
 
     private static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
 
     private static final Logger LOG = LoggerFactory.getLogger(JtaTransactionErrorHandlerReifier.class);
 
-    public JtaTransactionErrorHandlerReifier(Route route, TransactionErrorHandlerDefinition definition) {
+    public JtaTransactionErrorHandlerReifier(Route route, JtaTransactionErrorHandlerDefinition definition) {
         super(route, definition);
     }
 
@@ -73,7 +73,7 @@ public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<Trans
     }
 
     private JtaTransactionPolicy resolveTransactionPolicy(
-            TransactionErrorHandlerDefinition definition, CamelContext camelContext) {
+            JtaTransactionErrorHandlerDefinition definition, CamelContext camelContext) {
 
         JtaTransactionPolicy answer = (JtaTransactionPolicy) definition.getTransactedPolicy();
         if (answer == null && definition.getTransactedPolicyRef() != null) {
@@ -84,18 +84,18 @@ public class JtaTransactionErrorHandlerReifier extends ErrorHandlerReifier<Trans
         if (answer == null) {
             LOG.debug("No transaction policy configured on error handler. Will try find it in the registry.");
 
-            Map<String, TransactedPolicy> mapPolicy = findByTypeWithName(TransactedPolicy.class);
+            Map<String, JtaTransactionPolicy> mapPolicy = findByTypeWithName(JtaTransactionPolicy.class);
             if (mapPolicy != null && mapPolicy.size() == 1) {
-                TransactedPolicy policy = mapPolicy.values().iterator().next();
-                if (policy instanceof JtaTransactionPolicy) {
-                    answer = (JtaTransactionPolicy) policy;
+                JtaTransactionPolicy policy = mapPolicy.values().iterator().next();
+                if (policy != null) {
+                    answer = policy;
                 }
             }
 
             if (answer == null) {
-                TransactedPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
-                if (policy instanceof JtaTransactionPolicy) {
-                    answer = (JtaTransactionPolicy) policy;
+                JtaTransactionPolicy policy = lookupByNameAndType(PROPAGATION_REQUIRED, JtaTransactionPolicy.class);
+                if (policy != null) {
+                    answer = policy;
                 }
             }
 
diff --git a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
index c7dc9994e3d..e8672e11531 100644
--- a/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
+++ b/components/camel-jta/src/main/java/org/apache/camel/jta/JtaTransactionPolicy.java
@@ -26,14 +26,14 @@ import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
 import org.apache.camel.model.errorhandler.ErrorHandlerRefDefinition;
-import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.spi.TransactedPolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Sets a proper error handler. This class is based on org.apache.camel.spring.spi.SpringTransactionPolicy.
- * <p>
+ * JTA transaction policy when using JTA based transactions.
+ *
  * This class requires the resource TransactionManager to be available through JNDI url
  * &quot;java:/TransactionManager&quot;
  */
@@ -86,20 +86,20 @@ public abstract class JtaTransactionPolicy implements TransactedPolicy {
             }
         }
 
-        TransactionErrorHandlerDefinition txBuilder;
+        JtaTransactionErrorHandlerDefinition txBuilder;
         if (builder != null && builder.supportTransacted()) {
-            if (!(builder instanceof TransactionErrorHandlerDefinition)) {
+            if (!(builder instanceof JtaTransactionErrorHandlerDefinition)) {
                 throw new RuntimeCamelException(
                         "The given transactional error handler builder '" + builder
-                                                + "' is not of type '" + TransactionErrorHandlerDefinition.class.getName()
+                                                + "' is not of type '" + JtaTransactionErrorHandlerDefinition.class.getName()
                                                 + "' which is required in this environment!");
             }
-            LOG.debug("The ErrorHandlerBuilder configured is a JtaTransactionErrorHandlerBuilder: {}", builder);
-            txBuilder = (TransactionErrorHandlerDefinition) builder.cloneBuilder();
+            LOG.debug("The ErrorHandlerBuilder configured is a JtaTransactionErrorHandlerDefinition: {}", builder);
+            txBuilder = (JtaTransactionErrorHandlerDefinition) builder.cloneBuilder();
         } else {
             LOG.debug(
-                    "No or no transactional ErrorHandlerBuilder configured, will use default JtaTransactionErrorHandlerBuilder settings");
-            txBuilder = new TransactionErrorHandlerDefinition();
+                    "No or no transactional ErrorHandlerBuilder configured, will use default JtaTransactionErrorHandlerDefinition settings");
+            txBuilder = new JtaTransactionErrorHandlerDefinition();
         }
 
         txBuilder.setTransactedPolicy(this);
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
index 4c880cf3ec1..2270d1ee097 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
@@ -33,7 +33,7 @@ import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.support.TransactionTemplate;
 
 /**
- * Wraps the processor in a Spring transaction
+ * Spring transaction policy when using spring based transactions.
  */
 public class SpringTransactionPolicy implements TransactedPolicy {
     private static final Logger LOG = LoggerFactory.getLogger(SpringTransactionPolicy.class);
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
index dbe2006a38f..8ce2367774f 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandlerReifier.java
@@ -25,6 +25,7 @@ import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
@@ -32,7 +33,6 @@ import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.ThreadPoolProfile;
-import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,11 +41,11 @@ import org.springframework.transaction.support.TransactionTemplate;
 
 import static org.apache.camel.model.TransactedDefinition.PROPAGATION_REQUIRED;
 
-public class TransactionErrorHandlerReifier extends ErrorHandlerReifier<TransactionErrorHandlerDefinition> {
+public class TransactionErrorHandlerReifier extends ErrorHandlerReifier<SpringTransactionErrorHandlerDefinition> {
 
     private static final Logger LOG = LoggerFactory.getLogger(TransactionErrorHandlerReifier.class);
 
-    public TransactionErrorHandlerReifier(Route route, TransactionErrorHandlerDefinition definition) {
+    public TransactionErrorHandlerReifier(Route route, SpringTransactionErrorHandlerDefinition definition) {
         super(route, definition);
     }
 
@@ -79,30 +79,28 @@ public class TransactionErrorHandlerReifier extends ErrorHandlerReifier<Transact
 
         TransactionTemplate answer = null;
 
-        TransactedPolicy policy = (TransactedPolicy) definition.getTransactedPolicy();
+        SpringTransactionPolicy policy = (SpringTransactionPolicy) definition.getTransactedPolicy();
         if (policy == null && definition.getTransactedPolicyRef() != null) {
-            policy = mandatoryLookup(definition.getTransactedPolicyRef(), TransactedPolicy.class);
+            policy = mandatoryLookup(definition.getTransactedPolicyRef(), SpringTransactionPolicy.class);
         }
         if (policy != null) {
-            if (policy instanceof SpringTransactionPolicy) {
-                answer = ((SpringTransactionPolicy) policy).getTransactionTemplate();
-            }
+            answer = ((SpringTransactionPolicy) policy).getTransactionTemplate();
         }
 
         if (answer == null) {
-            Map<String, TransactedPolicy> mapPolicy = findByTypeWithName(TransactedPolicy.class);
+            Map<String, SpringTransactionPolicy> mapPolicy = findByTypeWithName(SpringTransactionPolicy.class);
             if (mapPolicy != null && mapPolicy.size() == 1) {
                 policy = mapPolicy.values().iterator().next();
-                if (policy instanceof SpringTransactionPolicy) {
-                    answer = ((SpringTransactionPolicy) policy).getTransactionTemplate();
+                if (policy != null) {
+                    answer = policy.getTransactionTemplate();
                 }
             }
         }
 
         if (answer == null) {
-            policy = lookupByNameAndType(PROPAGATION_REQUIRED, TransactedPolicy.class);
-            if (policy instanceof SpringTransactionPolicy) {
-                answer = ((SpringTransactionPolicy) policy).getTransactionTemplate();
+            policy = lookupByNameAndType(PROPAGATION_REQUIRED, SpringTransactionPolicy.class);
+            if (policy != null) {
+                answer = policy.getTransactionTemplate();
             }
         }
 
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
index caa9169a32e..191cce43a92 100644
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
@@ -81,6 +81,7 @@ joor
 json
 jsonApi
 jsonpath
+jtaTransactionErrorHandler
 kamelet
 kubernetesServiceDiscovery
 language
@@ -172,6 +173,7 @@ soap
 sort
 spel
 split
+springTransactionErrorHandler
 staticServiceDiscovery
 step
 sticky
@@ -196,7 +198,6 @@ toD
 tokenize
 topic
 transacted
-transactionErrorHandler
 transform
 transformers
 typeFilter
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json
index 6ed2014de84..9b2e751b23a 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorHandler.json
@@ -12,7 +12,7 @@
     "output": false
   },
   "properties": {
-    "errorHandlerType": { "kind": "element", "displayName": "Error Handler Type", "required": true, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "oneOf": [ "deadLetterChannel", "defaultErrorHandler", "noErrorHandler", "transactionErrorHandler" ], "deprecated": false, "autowired": false, "secret": false },
+    "errorHandlerType": { "kind": "element", "displayName": "Error Handler Type", "required": true, "type": "object", "javaType": "org.apache.camel.ErrorHandlerFactory", "oneOf": [ "deadLetterChannel", "defaultErrorHandler", "jtaTransactionErrorHandler", "noErrorHandler", "springTransactionErrorHandler" ], "deprecated": false, "autowired": false, "secret": false },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
 }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index
index 0fb3a1aa359..1daaba1595c 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jaxb.index
@@ -2,5 +2,6 @@
 DeadLetterChannelDefinition
 DefaultErrorHandlerDefinition
 ErrorHandlerRefDefinition
+JtaTransactionErrorHandlerDefinition
 NoErrorHandlerDefinition
-TransactionErrorHandlerDefinition
+SpringTransactionErrorHandlerDefinition
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json
similarity index 97%
copy from core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
copy to core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json
index b8469bebef1..e80961aebb2 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/jtaTransactionErrorHandler.json
@@ -1,12 +1,12 @@
 {
   "model": {
     "kind": "model",
-    "name": "transactionErrorHandler",
-    "title": "Transaction Error Handler",
-    "description": "Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).",
+    "name": "jtaTransactionErrorHandler",
+    "title": "Jta Transaction Error Handler",
+    "description": "JTA based transactional error handler (requires camel-jta).",
     "deprecated": false,
     "label": "configuration,error",
-    "javaType": "org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition",
+    "javaType": "org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition",
     "abstract": false,
     "input": false,
     "output": false
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json
similarity index 97%
rename from core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
rename to core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json
index b8469bebef1..13e9822a850 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/springTransactionErrorHandler.json
@@ -1,12 +1,12 @@
 {
   "model": {
     "kind": "model",
-    "name": "transactionErrorHandler",
-    "title": "Transaction Error Handler",
-    "description": "Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).",
+    "name": "springTransactionErrorHandler",
+    "title": "Spring Transaction Error Handler",
+    "description": "Spring based transactional error handler (requires camel-spring).",
     "deprecated": false,
     "label": "configuration,error",
-    "javaType": "org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition",
+    "javaType": "org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition",
     "abstract": false,
     "input": false,
     "output": false
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java
index 3ae391ca309..73601356103 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ErrorHandlerDefinition.java
@@ -25,8 +25,9 @@ import javax.xml.bind.annotation.XmlRootElement;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.JtaTransactionErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
-import org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.SpringTransactionErrorHandlerDefinition;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -41,7 +42,8 @@ public class ErrorHandlerDefinition extends IdentifiedType {
             @XmlElement(name = "deadLetterChannel", type = DeadLetterChannelDefinition.class),
             @XmlElement(name = "defaultErrorHandler", type = DefaultErrorHandlerDefinition.class),
             @XmlElement(name = "noErrorHandler", type = NoErrorHandlerDefinition.class),
-            @XmlElement(name = "transactionErrorHandler", type = TransactionErrorHandlerDefinition.class) })
+            @XmlElement(name = "jtaTransactionErrorHandler", type = JtaTransactionErrorHandlerDefinition.class),
+            @XmlElement(name = "springTransactionErrorHandler", type = SpringTransactionErrorHandlerDefinition.class) })
     private ErrorHandlerFactory errorHandlerType;
 
     public ErrorHandlerFactory getErrorHandlerType() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java
new file mode 100644
index 00000000000..3fe3fe2c4fd
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/JtaTransactionErrorHandlerDefinition.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.model.errorhandler;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * JTA based transactional error handler (requires camel-jta).
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "jtaTransactionErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class JtaTransactionErrorHandlerDefinition extends TransactionErrorHandlerDefinition {
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        TransactionErrorHandlerDefinition answer = new JtaTransactionErrorHandlerDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java
new file mode 100644
index 00000000000..c1531542881
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/SpringTransactionErrorHandlerDefinition.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.model.errorhandler;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * Spring based transactional error handler (requires camel-spring).
+ */
+@Metadata(label = "configuration,error")
+@XmlRootElement(name = "springTransactionErrorHandler")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class SpringTransactionErrorHandlerDefinition extends TransactionErrorHandlerDefinition {
+
+    @Override
+    public ErrorHandlerFactory cloneBuilder() {
+        TransactionErrorHandlerDefinition answer = new SpringTransactionErrorHandlerDefinition();
+        cloneBuilder(answer);
+        return answer;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
index b8e769172b6..d3d59e111b5 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
@@ -16,23 +16,16 @@
  */
 package org.apache.camel.model.errorhandler;
 
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.spi.Metadata;
 
 /**
  * Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).
  */
-@Metadata(label = "configuration,error")
-@XmlRootElement(name = "transactionErrorHandler")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefinition {
+public abstract class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefinition {
 
     @XmlTransient
     private Object transactedPolicy;
@@ -49,13 +42,6 @@ public class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefini
         return true;
     }
 
-    @Override
-    public ErrorHandlerFactory cloneBuilder() {
-        TransactionErrorHandlerDefinition answer = new TransactionErrorHandlerDefinition();
-        cloneBuilder(answer);
-        return answer;
-    }
-
     protected void cloneBuilder(TransactionErrorHandlerDefinition other) {
         other.setTransactedPolicyRef(getTransactedPolicyRef());
         other.setRollbackLoggingLevel(getRollbackLoggingLevel());
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index 65321c4d460..88fc8bff1f3 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -386,7 +386,8 @@ public class ModelParser extends BaseParser {
                 case "deadLetterChannel": def.setErrorHandlerType(doParseDeadLetterChannelDefinition()); break;
                 case "defaultErrorHandler": def.setErrorHandlerType(doParseDefaultErrorHandlerDefinition()); break;
                 case "noErrorHandler": def.setErrorHandlerType(doParseNoErrorHandlerDefinition()); break;
-                case "transactionErrorHandler": def.setErrorHandlerType(doParseTransactionErrorHandlerDefinition()); break;
+                case "jtaTransactionErrorHandler": def.setErrorHandlerType(doParseJtaTransactionErrorHandlerDefinition()); break;
+                case "springTransactionErrorHandler": def.setErrorHandlerType(doParseSpringTransactionErrorHandlerDefinition()); break;
                 default: return false;
             }
             return true;
@@ -2583,19 +2584,27 @@ public class ModelParser extends BaseParser {
             return identifiedTypeAttributeHandler().accept(def, key, val);
         }, noElementHandler(), noValueHandler());
     }
-    protected NoErrorHandlerDefinition doParseNoErrorHandlerDefinition() throws IOException, XmlPullParserException {
-        return doParse(new NoErrorHandlerDefinition(),
-            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    protected JtaTransactionErrorHandlerDefinition doParseJtaTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new JtaTransactionErrorHandlerDefinition(),
+            transactionErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
     }
-    protected TransactionErrorHandlerDefinition doParseTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
-        return doParse(new TransactionErrorHandlerDefinition(), (def, key, val) -> {
+    protected <T extends TransactionErrorHandlerDefinition> AttributeHandler<T> transactionErrorHandlerDefinitionAttributeHandler() {
+        return (def, key, val) -> {
             switch (key) {
                 case "rollbackLoggingLevel": def.setRollbackLoggingLevel(val); break;
                 case "transactedPolicyRef": def.setTransactedPolicyRef(val); break;
                 default: return defaultErrorHandlerDefinitionAttributeHandler().accept(def, key, val);
             }
             return true;
-        }, defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
+        };
+    }
+    protected NoErrorHandlerDefinition doParseNoErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new NoErrorHandlerDefinition(),
+            identifiedTypeAttributeHandler(), noElementHandler(), noValueHandler());
+    }
+    protected SpringTransactionErrorHandlerDefinition doParseSpringTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
+        return doParse(new SpringTransactionErrorHandlerDefinition(),
+            transactionErrorHandlerDefinitionAttributeHandler(), defaultErrorHandlerDefinitionElementHandler(), noValueHandler());
     }
     protected CSimpleExpression doParseCSimpleExpression() throws IOException, XmlPullParserException {
         return doParse(new CSimpleExpression(), (def, key, val) -> {