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

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


The following commit(s) were added to refs/heads/main by this push:
     new e63b4657368a CAMEL-22542: rest-dsl - Add support for using 
camel-jacksonxml for XML pojo binding (instead of jaxb) (#19557)
e63b4657368a is described below

commit e63b4657368aa9ebe615af10e7ae2f3ae1e559a5
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Oct 14 16:18:24 2025 +0200

    CAMEL-22542: rest-dsl - Add support for using camel-jacksonxml for XML pojo 
binding (instead of jaxb) (#19557)
---
 .../rest-binding-jacksonxml-dataformat-factory     |  2 +
 ...XMLRestBindingJacksonXmlDataFormatFactory.java} | 29 ++++----
 .../jaxb/JaxbRestBindingJaxbDataFormatFactory.java |  1 +
 components/camel-jetty/pom.xml                     |  5 ++
 .../rest/RestJettyBindingModeJacksonXmlTest.java   | 78 ++++++++++++++++++++++
 .../component/jetty/rest/UserJacksonXmlPojo.java   | 45 +++++++++++++
 .../RestBindingJacksonXmlDataFormatFactory.java    | 40 +++++++++++
 .../camel/impl/engine/AbstractCamelContext.java    |  5 ++
 .../camel/impl/engine/SimpleCamelContext.java      | 17 +++++
 .../org/apache/camel/support/PluginHelper.java     | 16 +++++
 .../processor/RestBindingAdviceFactory.java        | 35 ++++++----
 docs/user-manual/modules/ROOT/pages/rest-dsl.adoc  | 12 +++-
 12 files changed, 253 insertions(+), 32 deletions(-)

diff --git 
a/components/camel-jacksonxml/src/generated/resources/META-INF/services/org/apache/camel/rest-binding-jacksonxml-dataformat-factory
 
b/components/camel-jacksonxml/src/generated/resources/META-INF/services/org/apache/camel/rest-binding-jacksonxml-dataformat-factory
new file mode 100644
index 000000000000..0f0e36e8207e
--- /dev/null
+++ 
b/components/camel-jacksonxml/src/generated/resources/META-INF/services/org/apache/camel/rest-binding-jacksonxml-dataformat-factory
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.jacksonxml.JacksonXMLRestBindingJacksonXmlDataFormatFactory
diff --git 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
 
b/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLRestBindingJacksonXmlDataFormatFactory.java
similarity index 85%
copy from 
components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
copy to 
components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLRestBindingJacksonXmlDataFormatFactory.java
index 970bc8a36405..a79c14247b82 100644
--- 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
+++ 
b/components/camel-jacksonxml/src/main/java/org/apache/camel/component/jacksonxml/JacksonXMLRestBindingJacksonXmlDataFormatFactory.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.converter.jaxb;
+package org.apache.camel.component.jacksonxml;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -22,28 +22,29 @@ import java.util.Map;
 import org.apache.camel.CamelContext;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.PropertyConfigurer;
-import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
+import org.apache.camel.spi.RestBindingJacksonXmlDataFormatFactory;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.annotations.JdkService;
 import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.PropertyBindingSupport;
 
 /**
- * JAXB based {@link RestBindingJaxbDataFormatFactory}.
+ * Jackson based {@link RestBindingJacksonXmlDataFormatFactory}.
  */
-@JdkService(RestBindingJaxbDataFormatFactory.FACTORY)
-public class JaxbRestBindingJaxbDataFormatFactory implements 
RestBindingJaxbDataFormatFactory {
+@JdkService(RestBindingJacksonXmlDataFormatFactory.FACTORY)
+public class JacksonXMLRestBindingJacksonXmlDataFormatFactory implements 
RestBindingJacksonXmlDataFormatFactory {
+
     @Override
-    public void setupJaxb(
+    public void setupJacksonXml(
             CamelContext camelContext, RestConfiguration config,
             String type, Class<?> typeClass, String outType, Class<?> 
outTypeClass,
-            DataFormat jaxb, DataFormat outJaxb)
+            DataFormat xml, DataFormat outXml)
             throws Exception {
         // lookup configurer
         PropertyConfigurer configurer = 
PluginHelper.getConfigurerResolver(camelContext)
-                .resolvePropertyConfigurer("jaxb-dataformat-configurer", 
camelContext);
+                .resolvePropertyConfigurer("jacksonXml-dataformat-configurer", 
camelContext);
         if (configurer == null) {
-            throw new IllegalStateException("Cannot find configurer for 
dataformat: jaxb");
+            throw new IllegalStateException("Cannot find configurer for 
dataformat: jacksonXml");
         }
 
         //
@@ -53,12 +54,11 @@ public class JaxbRestBindingJaxbDataFormatFactory 
implements RestBindingJaxbData
         PropertyBindingSupport.Builder builder = PropertyBindingSupport.build()
                 .withCamelContext(camelContext)
                 .withConfigurer(configurer)
-                .withTarget(jaxb);
+                .withTarget(xml);
 
         final String typeName = getTypeName(type, typeClass);
         if (typeName != null) {
-            builder.withProperty("contextPath", typeName);
-            builder.withProperty("contextPathIsClassName", "true");
+            builder.withProperty("unmarshalTypeName", typeName);
         }
 
         setAdditionalConfiguration(config, "xml.in.", builder);
@@ -71,13 +71,12 @@ public class JaxbRestBindingJaxbDataFormatFactory 
implements RestBindingJaxbData
         PropertyBindingSupport.Builder outBuilder = 
PropertyBindingSupport.build()
                 .withCamelContext(camelContext)
                 .withConfigurer(configurer)
-                .withTarget(outJaxb);
+                .withTarget(outXml);
 
         final String outTypeName = getOutTypeName(outType, outTypeClass, 
typeName);
 
         if (outTypeName != null) {
-            outBuilder.withProperty("contextPath", outTypeName);
-            outBuilder.withProperty("contextPathIsClassName", "true");
+            outBuilder.withProperty("unmarshalTypeName", outTypeName);
         }
 
         setAdditionalConfiguration(config, "xml.out.", outBuilder);
diff --git 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
 
b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
index 970bc8a36405..cedbd5fe90d8 100644
--- 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
+++ 
b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/JaxbRestBindingJaxbDataFormatFactory.java
@@ -33,6 +33,7 @@ import org.apache.camel.support.PropertyBindingSupport;
  */
 @JdkService(RestBindingJaxbDataFormatFactory.FACTORY)
 public class JaxbRestBindingJaxbDataFormatFactory implements 
RestBindingJaxbDataFormatFactory {
+
     @Override
     public void setupJaxb(
             CamelContext camelContext, RestConfiguration config,
diff --git a/components/camel-jetty/pom.xml b/components/camel-jetty/pom.xml
index f60cbea566e1..788c46ba5279 100644
--- a/components/camel-jetty/pom.xml
+++ b/components/camel-jetty/pom.xml
@@ -142,6 +142,11 @@
             <artifactId>camel-jackson</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-jacksonxml</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-jaxb</artifactId>
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyBindingModeJacksonXmlTest.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyBindingModeJacksonXmlTest.java
new file mode 100644
index 000000000000..df2bbc1813e4
--- /dev/null
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/RestJettyBindingModeJacksonXmlTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.component.jetty.rest;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jetty.BaseJettyTest;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.rest.RestBindingMode;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
+public class RestJettyBindingModeJacksonXmlTest extends BaseJettyTest {
+
+    @Test
+    public void testBindingMode() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:input");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(UserJacksonXmlPojo.class);
+
+        String body = "<user name=\"Donald Duck\" id=\"123\"></user>";
+        template.sendBody("http://localhost:"; + getPort() + "/users/new", 
body);
+
+        MockEndpoint.assertIsSatisfied(context);
+
+        UserJacksonXmlPojo user = 
mock.getReceivedExchanges().get(0).getIn().getBody(UserJacksonXmlPojo.class);
+        assertNotNull(user);
+        assertEquals(123, user.getIdentifier());
+        assertEquals("Donald Duck", user.getUserName());
+    }
+
+    @Test
+    public void testBindingModeWrong() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:input");
+        mock.expectedMessageCount(0);
+
+        // we bind to xml, but send in json, which is not possible
+        String body = "{\"id\": 123, \"name\": \"Donald Duck\"}";
+        try {
+            template.sendBody("http://localhost:"; + getPort() + "/users/new", 
body);
+            fail("Should have thrown exception");
+        } catch (Exception e) {
+            // expected
+        }
+
+        MockEndpoint.assertIsSatisfied(context);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                
restConfiguration().component("jetty").host("localhost").port(getPort())
+                        
.bindingMode(RestBindingMode.xml).xmlDataFormat("jacksonXml");
+
+                // use the rest DSL to define the rest services
+                
rest("/users/").post("new").type(UserJacksonXmlPojo.class).to("mock:input");
+            }
+        };
+    }
+}
diff --git 
a/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/UserJacksonXmlPojo.java
 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/UserJacksonXmlPojo.java
new file mode 100644
index 000000000000..84198e318160
--- /dev/null
+++ 
b/components/camel-jetty/src/test/java/org/apache/camel/component/jetty/rest/UserJacksonXmlPojo.java
@@ -0,0 +1,45 @@
+/*
+ * 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.component.jetty.rest;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonRootName;
+
+@JsonRootName(value = "user")
+public class UserJacksonXmlPojo {
+
+    @JsonProperty("id")
+    private int identifier;
+    @JsonProperty("name")
+    private String userName;
+
+    public int getIdentifier() {
+        return identifier;
+    }
+
+    public void setIdentifier(int identifier) {
+        this.identifier = identifier;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/RestBindingJacksonXmlDataFormatFactory.java
 
b/core/camel-api/src/main/java/org/apache/camel/spi/RestBindingJacksonXmlDataFormatFactory.java
new file mode 100644
index 000000000000..ac032e1d41b7
--- /dev/null
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/RestBindingJacksonXmlDataFormatFactory.java
@@ -0,0 +1,40 @@
+/*
+ * 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.spi;
+
+import org.apache.camel.CamelContext;
+
+/**
+ * SPI for setting up XML data format (jacksonXml) for rest-dsl.
+ */
+public interface RestBindingJacksonXmlDataFormatFactory {
+
+    /**
+     * Service factory key.
+     */
+    String FACTORY = "rest-binding-jacksonxml-dataformat-factory";
+
+    /**
+     * Setup XML data format
+     */
+    void setupJacksonXml(
+            CamelContext camelContext, RestConfiguration config,
+            String type, Class<?> typeClass, String outType, Class<?> 
outTypeClass,
+            DataFormat jacksonXml, DataFormat outJacksonXml)
+            throws Exception;
+
+}
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 5477a2773ea1..681e00ad5a08 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -152,6 +152,7 @@ import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.ReactiveExecutor;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.ResourceLoader;
+import org.apache.camel.spi.RestBindingJacksonXmlDataFormatFactory;
 import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestRegistry;
@@ -382,6 +383,8 @@ public abstract class AbstractCamelContext extends 
BaseService
         camelContextExtension.lazyAddContextPlugin(RuntimeCamelCatalog.class, 
this::createRuntimeCamelCatalog);
         
camelContextExtension.lazyAddContextPlugin(RestBindingJaxbDataFormatFactory.class,
                 this::createRestBindingJaxbDataFormatFactory);
+        
camelContextExtension.lazyAddContextPlugin(RestBindingJacksonXmlDataFormatFactory.class,
+                this::createRestBindingJacksonXmlDataFormatFactory);
         camelContextExtension.lazyAddContextPlugin(BeanProxyFactory.class, 
this::createBeanProxyFactory);
         camelContextExtension.lazyAddContextPlugin(UnitOfWorkFactory.class, 
this::createUnitOfWorkFactory);
         camelContextExtension.lazyAddContextPlugin(BeanIntrospection.class, 
this::createBeanIntrospection);
@@ -4457,6 +4460,8 @@ public abstract class AbstractCamelContext extends 
BaseService
 
     protected abstract RestBindingJaxbDataFormatFactory 
createRestBindingJaxbDataFormatFactory();
 
+    protected abstract RestBindingJacksonXmlDataFormatFactory 
createRestBindingJacksonXmlDataFormatFactory();
+
     protected abstract RuntimeCamelCatalog createRuntimeCamelCatalog();
 
     protected abstract DumpRoutesStrategy createDumpRoutesStrategy();
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
index f25f6f7775b5..0a4a0a53fbe1 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
@@ -83,6 +83,7 @@ import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.ReactiveExecutor;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.ResourceLoader;
+import org.apache.camel.spi.RestBindingJacksonXmlDataFormatFactory;
 import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
 import org.apache.camel.spi.RestRegistryFactory;
 import org.apache.camel.spi.RouteController;
@@ -638,6 +639,22 @@ public class SimpleCamelContext extends 
AbstractCamelContext {
         }
     }
 
+    @Override
+    protected RestBindingJacksonXmlDataFormatFactory 
createRestBindingJacksonXmlDataFormatFactory() {
+        Optional<RestBindingJacksonXmlDataFormatFactory> result = 
ResolverHelper.resolveService(
+                getCamelContextReference(),
+                getCamelContextExtension().getBootstrapFactoryFinder(),
+                RestBindingJacksonXmlDataFormatFactory.FACTORY,
+                RestBindingJacksonXmlDataFormatFactory.class);
+
+        if (result.isPresent()) {
+            return result.get();
+        } else {
+            throw new IllegalArgumentException(
+                    "Cannot find RestBindingJacksonXmlDataFormatFactory on 
classpath. Add camel-jacksonxml to classpath.");
+        }
+    }
+
     @Override
     protected Tracer createTracer() {
         Tracer tracer = null;
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
index aae3c7c8536b..3de356481544 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
@@ -50,6 +50,7 @@ import org.apache.camel.spi.PeriodTaskResolver;
 import org.apache.camel.spi.PeriodTaskScheduler;
 import org.apache.camel.spi.ProcessorFactory;
 import org.apache.camel.spi.ResourceLoader;
+import org.apache.camel.spi.RestBindingJacksonXmlDataFormatFactory;
 import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
 import org.apache.camel.spi.RouteFactory;
 import org.apache.camel.spi.RoutesLoader;
@@ -451,6 +452,21 @@ public final class PluginHelper {
         return 
extendedCamelContext.getContextPlugin(RestBindingJaxbDataFormatFactory.class);
     }
 
+    /**
+     * Gets the {@link RestBindingJacksonXmlDataFormatFactory} to be used.
+     */
+    public static RestBindingJacksonXmlDataFormatFactory 
getRestBindingJacksonXmlDataFormatFactory(CamelContext camelContext) {
+        return 
getRestBindingJacksonXmlDataFormatFactory(camelContext.getCamelContextExtension());
+    }
+
+    /**
+     * Gets the {@link RestBindingJacksonXmlDataFormatFactory} to be used.
+     */
+    public static RestBindingJacksonXmlDataFormatFactory 
getRestBindingJacksonXmlDataFormatFactory(
+            ExtendedCamelContext extendedCamelContext) {
+        return 
extendedCamelContext.getContextPlugin(RestBindingJacksonXmlDataFormatFactory.class);
+    }
+
     /**
      * Gets the {@link BeanProxyFactory} to use.
      */
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/processor/RestBindingAdviceFactory.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/processor/RestBindingAdviceFactory.java
index b381c6fb7f99..70977c46108c 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/processor/RestBindingAdviceFactory.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/processor/RestBindingAdviceFactory.java
@@ -86,8 +86,8 @@ public class RestBindingAdviceFactory {
         }
 
         // setup xml data format
-        DataFormat jaxb = null;
-        DataFormat outJaxb = null;
+        DataFormat xml = null;
+        DataFormat outXml = null;
         if (mode.contains("xml") || "auto".equals(mode)) {
             String name = config.getXmlDataFormat();
             if (name != null) {
@@ -100,22 +100,29 @@ public class RestBindingAdviceFactory {
             } else {
                 name = "jaxb";
             }
-            // this will create a new instance as the name was not already
-            // pre-created
-            jaxb = camelContext.createDataFormat(name);
-            outJaxb = camelContext.createDataFormat(name);
+            // this will create a new instance as the name was not already 
pre-created
+            xml = camelContext.createDataFormat(name);
+            outXml = camelContext.createDataFormat(name);
 
             // is xml binding required?
-            if (mode.contains("xml") && jaxb == null) {
+            if (mode.contains("xml") && xml == null) {
                 throw new IllegalArgumentException("XML DataFormat " + name + 
" not found.");
             }
 
-            if (jaxb != null) {
-                // to setup JAXB we need to use camel-jaxb
-                
PluginHelper.getRestBindingJaxbDataFormatFactory(camelContext).setupJaxb(camelContext,
 config,
-                        bc.getType(), bc.getTypeClass(),
-                        bc.getOutType(), bc.getOutTypeClass(),
-                        jaxb, outJaxb);
+            if (xml != null) {
+                if ("jacksonXml".equalsIgnoreCase(name)) {
+                    // to setup jackson we need to use camel-jacksonxml
+                    
PluginHelper.getRestBindingJacksonXmlDataFormatFactory(camelContext).setupJacksonXml(camelContext,
 config,
+                            bc.getType(), bc.getTypeClass(),
+                            bc.getOutType(), bc.getOutTypeClass(),
+                            xml, outXml);
+                } else {
+                    // to setup JAXB we need to use camel-jaxb
+                    
PluginHelper.getRestBindingJaxbDataFormatFactory(camelContext).setupJaxb(camelContext,
 config,
+                            bc.getType(), bc.getTypeClass(),
+                            bc.getOutType(), bc.getOutTypeClass(),
+                            xml, outXml);
+                }
             }
         }
 
@@ -129,7 +136,7 @@ public class RestBindingAdviceFactory {
         }
 
         return new RestBindingAdvice(
-                camelContext, json, jaxb, outJson, outJaxb,
+                camelContext, json, xml, outJson, outXml,
                 bc.getConsumes(), bc.getProduces(), mode, 
bc.isSkipBindingOnErrorCode(), bc.isClientRequestValidation(),
                 bc.isClientResponseValidation(), bc.isEnableCORS(), 
bc.isEnableNoContentResponse(), bc.getCorsHeaders(),
                 bc.getQueryDefaultValues(), bc.getQueryAllowedValues(), 
bc.isRequiredBody(), bc.getRequiredQueryParameters(),
diff --git a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc 
b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
index 3f6efa3038d6..5c0a37fb833a 100644
--- a/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
+++ b/docs/user-manual/modules/ROOT/pages/rest-dsl.adoc
@@ -342,13 +342,14 @@ The binding modes are:
 |`auto` |Binding is enabled, and Camel is relaxed and supports JSON, XML or 
both if
 the necessary data formats are included in the classpath. Notice that if
 for example `camel-jaxb` is not on the classpath, then XML binding is
-not enabled.
+not enabled. Notice that for XML then `jaxb` is default, and you must be 
explicit to set `xmlDataFormat=jacksonXml`
+if you want to use jackson XML instead.
 
 |`json` |Binding to/from JSON is enabled, and requires a JSON capable data
 format on the classpath. By default, Camel will use `jackson` as the
 data format.
 
-|`xm` |Binding to/from XML is enabled, and requires `camel-jaxb` on the
+|`xm` |Binding to/from XML is enabled, and requires `camel-jaxb` or 
`camel-jacksonxml` on the
 classpath.
 
 |`json_xml` |Binding to/from JSON and XML is enabled and requires both data 
formats to
@@ -378,10 +379,15 @@ 
restConfiguration().dataFormatProperty("contentTypeHeader", "false");
 ----
 
 To use binding you must include the necessary data formats on the
-classpath, such as `camel-jaxb` and/or `camel-jackson`. And then enable
+classpath, such as `camel-jaxb` / `camel-jacksonxml` and/or `camel-jackson`. 
And then enable
 the binding mode. You can configure the binding mode globally on the
 rest configuration, and then override per rest service as well.
 
+[NOTE]
+====
+To use Jackson XML for XML binding, then you must configure 
`xmlDataformat=jacksonXml` and include `camel-jacksonxml` on the classpath.
+====
+
 To enable binding, you configure this in Java DSL as shown below:
 
 [source,java]

Reply via email to