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/12/30 17:12:19 UTC

[camel] branch camel-3.20.x updated: CAMEL-18850: camel-core-model - @XmlAttributes should be String or Enum type only

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

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


The following commit(s) were added to refs/heads/camel-3.20.x by this push:
     new 858caf5520e CAMEL-18850: camel-core-model - @XmlAttributes should be String or Enum type only
858caf5520e is described below

commit 858caf5520e5d99c8a63d56524110707f773a601
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Dec 30 18:11:46 2022 +0100

    CAMEL-18850: camel-core-model - @XmlAttributes should be String or Enum type only
---
 .../jsonapi/JsonApiDataFormatConfigurer.java       |   4 +-
 .../apache/camel/component/jsonapi/jsonApi.json    |   4 +-
 .../camel/component/jsonapi/JsonApiDataFormat.java | 109 ++++++++++++++++----
 .../component/jsonapi/JsonApiDataFormatTest.java   |   4 +-
 .../org/apache/camel/model/dataformat/jsonApi.json |   4 +-
 .../camel/model/dataformat/JsonApiDataFormat.java  |  72 ++++++++++---
 .../model/rest/RestConfigurationDefinition.java    | 114 ++++++++++++++++-----
 .../dataformat/JsonApiDataFormatReifier.java       |   2 +
 .../java/org/apache/camel/xml/in/ModelParser.java  |  16 +--
 .../dsl/yaml/deserializers/ModelDeserializers.java |  17 +--
 .../generated/resources/schema/camel-yaml-dsl.json |   3 +
 .../generated/resources/schema/camelYamlDsl.json   |   3 +
 12 files changed, 268 insertions(+), 84 deletions(-)

diff --git a/components/camel-jsonapi/src/generated/java/org/apache/camel/component/jsonapi/JsonApiDataFormatConfigurer.java b/components/camel-jsonapi/src/generated/java/org/apache/camel/component/jsonapi/JsonApiDataFormatConfigurer.java
index c7fc580ce12..433ac0fd2be 100644
--- a/components/camel-jsonapi/src/generated/java/org/apache/camel/component/jsonapi/JsonApiDataFormatConfigurer.java
+++ b/components/camel-jsonapi/src/generated/java/org/apache/camel/component/jsonapi/JsonApiDataFormatConfigurer.java
@@ -19,9 +19,9 @@ public class JsonApiDataFormatConfigurer extends PropertyConfigurerSupport imple
         JsonApiDataFormat dataformat = (JsonApiDataFormat) target;
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "dataformattypes":
-        case "dataFormatTypes": dataformat.setDataFormatTypes(property(camelContext, java.lang.Class[].class, value)); return true;
+        case "dataFormatTypes": dataformat.setDataFormatTypes(property(camelContext, java.lang.String.class, value)); return true;
         case "mainformattype":
-        case "mainFormatType": dataformat.setMainFormatType(property(camelContext, java.lang.Class.class, value)); return true;
+        case "mainFormatType": dataformat.setMainFormatType(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
         }
     }
diff --git a/components/camel-jsonapi/src/generated/resources/org/apache/camel/component/jsonapi/jsonApi.json b/components/camel-jsonapi/src/generated/resources/org/apache/camel/component/jsonapi/jsonApi.json
index 2f90a61c902..5d041aa89f7 100644
--- a/components/camel-jsonapi/src/generated/resources/org/apache/camel/component/jsonapi/jsonApi.json
+++ b/components/camel-jsonapi/src/generated/resources/org/apache/camel/component/jsonapi/jsonApi.json
@@ -16,8 +16,8 @@
     "modelJavaType": "org.apache.camel.model.dataformat.JsonApiDataFormat"
   },
   "properties": {
-    "dataFormatTypes": { "kind": "attribute", "displayName": "Data Format Types", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>[]", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account for the marshalling" },
-    "mainFormatType": { "kind": "attribute", "displayName": "Main Format Type", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account while unmarshalling" },
+    "dataFormatTypes": { "kind": "attribute", "displayName": "Data Format Types", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account for the marshalling. Multiple classes can be separated by comma." },
+    "mainFormatType": { "kind": "attribute", "displayName": "Main Format Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The class to take into account while unmarshalling." },
     "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/components/camel-jsonapi/src/main/java/org/apache/camel/component/jsonapi/JsonApiDataFormat.java b/components/camel-jsonapi/src/main/java/org/apache/camel/component/jsonapi/JsonApiDataFormat.java
index 523239f75ef..30aba088557 100644
--- a/components/camel-jsonapi/src/main/java/org/apache/camel/component/jsonapi/JsonApiDataFormat.java
+++ b/components/camel-jsonapi/src/main/java/org/apache/camel/component/jsonapi/JsonApiDataFormat.java
@@ -18,9 +18,13 @@ package org.apache.camel.component.jsonapi;
 
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 import com.github.jasminb.jsonapi.JSONAPIDocument;
 import com.github.jasminb.jsonapi.ResourceConverter;
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatName;
@@ -31,21 +35,35 @@ import org.apache.camel.support.service.ServiceSupport;
  * JSonApi data format for marshal/unmarshal
  */
 @Dataformat("jsonApi")
-public class JsonApiDataFormat extends ServiceSupport implements DataFormat, DataFormatName {
+public class JsonApiDataFormat extends ServiceSupport implements DataFormat, DataFormatName, CamelContextAware {
 
-    private Class<?>[] dataFormatTypes;
-    private Class<?> mainFormatType;
+    private CamelContext camelContext;
+
+    private String dataFormatTypes;
+    private Class<?>[] dataFormatTypeClasses;
+    private String mainFormatType;
+    private Class<?> mainFormatTypeClass;
 
     public JsonApiDataFormat() {
     }
 
-    public JsonApiDataFormat(Class<?>[] dataFormatTypes) {
-        this.dataFormatTypes = dataFormatTypes;
+    public JsonApiDataFormat(Class<?>[] dataFormatTypesClasses) {
+        this.dataFormatTypeClasses = dataFormatTypesClasses;
     }
 
-    public JsonApiDataFormat(Class<?> mainFormatType, Class<?>[] dataFormatTypes) {
-        this.mainFormatType = mainFormatType;
-        this.dataFormatTypes = dataFormatTypes;
+    public JsonApiDataFormat(Class<?> mainFormatTypeClass, Class<?>[] dataFormatTypes) {
+        this.mainFormatTypeClass = mainFormatTypeClass;
+        this.dataFormatTypeClasses = dataFormatTypes;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
     }
 
     @Override
@@ -55,39 +73,86 @@ public class JsonApiDataFormat extends ServiceSupport implements DataFormat, Dat
 
     @Override
     public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
-        ResourceConverter converter = new ResourceConverter(dataFormatTypes);
+        ResourceConverter converter = new ResourceConverter(dataFormatTypeClasses);
         byte[] objectAsBytes = converter.writeDocument(new JSONAPIDocument<>(graph));
         stream.write(objectAsBytes);
     }
 
     @Override
     public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
-        ResourceConverter converter = new ResourceConverter(dataFormatTypes);
-        JSONAPIDocument<?> jsonApiDocument = converter.readDocument(stream, mainFormatType);
+        ResourceConverter converter = new ResourceConverter(dataFormatTypeClasses);
+        JSONAPIDocument<?> jsonApiDocument = converter.readDocument(stream, mainFormatTypeClass);
         return jsonApiDocument.get();
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        // noop
+    public String getDataFormatTypes() {
+        return dataFormatTypes;
     }
 
-    @Override
-    protected void doStop() throws Exception {
-        // noop
+    /**
+     * The classes (FQN name) to take into account for the marshalling.
+     * Multiple class names can be separated by comma.
+     */
+    public void setDataFormatTypes(String dataFormatTypes) {
+        this.dataFormatTypes = dataFormatTypes;
+    }
+
+    public Class<?>[] getDataFormatTypeClasses() {
+        return dataFormatTypeClasses;
     }
 
     /**
-     * The classes to take into account while marshalling
+     * The classes to take into account for the marshalling.
      */
-    public void setDataFormatTypes(Class<?>[] dataFormatTypes) {
-        this.dataFormatTypes = dataFormatTypes;
+    public void setDataFormatTypeClasses(Class<?>[] dataFormatTypeClasses) {
+        this.dataFormatTypeClasses = dataFormatTypeClasses;
+    }
+
+    public String getMainFormatType() {
+        return mainFormatType;
     }
 
     /**
-     * The classes to take into account while unmarshalling
+     * The class (FQN name) to take into account while unmarshalling
      */
-    public void setMainFormatType(Class<?> mainFormatType) {
+    public void setMainFormatType(String mainFormatType) {
         this.mainFormatType = mainFormatType;
     }
+
+    public Class<?> getMainFormatTypeClass() {
+        return mainFormatTypeClass;
+    }
+
+    /**
+     * The class to take into account while unmarshalling
+     */
+    public void setMainFormatTypeClass(Class<?> mainFormatTypeClass) {
+        this.mainFormatTypeClass = mainFormatTypeClass;
+    }
+
+    @Override
+    protected void doBuild() throws Exception {
+        if (dataFormatTypeClasses == null && dataFormatTypes != null) {
+            List<Class<?>> classes = new ArrayList<>();
+            for (String name : dataFormatTypes.split(",")) {
+                Class<?> clazz = getCamelContext().getClassResolver().resolveMandatoryClass(name);
+                classes.add(clazz);
+            }
+            dataFormatTypeClasses = classes.toArray(new Class<?>[0]);
+        }
+        if (mainFormatTypeClass == null && mainFormatType != null) {
+            mainFormatTypeClass = getCamelContext().getClassResolver().resolveMandatoryClass(mainFormatType);
+        }
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+        // noop
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        // noop
+    }
+
 }
diff --git a/components/camel-jsonapi/src/test/java/org/apache/camel/component/jsonapi/JsonApiDataFormatTest.java b/components/camel-jsonapi/src/test/java/org/apache/camel/component/jsonapi/JsonApiDataFormatTest.java
index ecad0a5bf17..f24ff5f3103 100644
--- a/components/camel-jsonapi/src/test/java/org/apache/camel/component/jsonapi/JsonApiDataFormatTest.java
+++ b/components/camel-jsonapi/src/test/java/org/apache/camel/component/jsonapi/JsonApiDataFormatTest.java
@@ -92,8 +92,8 @@ public class JsonApiDataFormatTest extends CamelTestSupport {
     public void testJsonApiUnmarshalWrongType() {
         Class<?>[] formats = { MyBook.class, MyAuthor.class };
         JsonApiDataFormat jsonApiDataFormat = new JsonApiDataFormat();
-        jsonApiDataFormat.setDataFormatTypes(formats);
-        jsonApiDataFormat.setMainFormatType(MyBook.class);
+        jsonApiDataFormat.setDataFormatTypeClasses(formats);
+        jsonApiDataFormat.setMainFormatTypeClass(MyBook.class);
 
         String jsonApiInput = "{\"data\":{\"type\":\"animal\",\"id\":\"camel\",\"attributes\":{\"humps\":\"2\"}}}";
 
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/jsonApi.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/jsonApi.json
index c654b024c42..781d1dba500 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/jsonApi.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/dataformat/jsonApi.json
@@ -13,8 +13,8 @@
     "output": false
   },
   "properties": {
-    "dataFormatTypes": { "kind": "attribute", "displayName": "Data Format Types", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>[]", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account for the marshalling" },
-    "mainFormatType": { "kind": "attribute", "displayName": "Main Format Type", "required": false, "type": "string", "javaType": "java.lang.Class<java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account while unmarshalling" },
+    "dataFormatTypes": { "kind": "attribute", "displayName": "Data Format Types", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The classes to take into account for the marshalling. Multiple classes can be separated by comma." },
+    "mainFormatType": { "kind": "attribute", "displayName": "Main Format Type", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The class to take into account while unmarshalling." },
     "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/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
index 5337c692943..e5dc64c047f 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonApiDataFormat.java
@@ -36,9 +36,13 @@ import org.apache.camel.spi.Metadata;
 public class JsonApiDataFormat extends DataFormatDefinition {
 
     @XmlAttribute
-    private Class<?>[] dataFormatTypes;
+    private String dataFormatTypes;
+    @XmlTransient
+    private Class<?>[] dataFormatTypeClasses;
     @XmlAttribute
-    private Class<?> mainFormatType;
+    private String mainFormatType;
+    @XmlTransient
+    private Class<?> mainFormatTypeClass;
 
     public JsonApiDataFormat() {
         super("jsonApi");
@@ -47,52 +51,96 @@ public class JsonApiDataFormat extends DataFormatDefinition {
     private JsonApiDataFormat(Builder builder) {
         this();
         this.dataFormatTypes = builder.dataFormatTypes;
+        this.dataFormatTypeClasses = builder.dataFormatTypeClasses;
         this.mainFormatType = builder.mainFormatType;
+        this.mainFormatTypeClass = builder.mainFormatTypeClass;
     }
 
-    public Class<?>[] getDataFormatTypes() {
+    public String getDataFormatTypes() {
         return dataFormatTypes;
     }
 
     /**
-     * The classes to take into account for the marshalling
+     * The classes to take into account for the marshalling.
+     * Multiple classes can be separated by comma.
      */
-    public void setDataFormatTypes(Class<?>[] dataFormatTypes) {
+    public void setDataFormatTypes(String dataFormatTypes) {
         this.dataFormatTypes = dataFormatTypes;
     }
 
-    public Class<?> getMainFormatType() {
+    public Class<?>[] getDataFormatTypeClasses() {
+        return dataFormatTypeClasses;
+    }
+
+    /**
+     * The classes to take into account for the marshalling.
+     */
+    public void setDataFormatTypeClasses(Class<?>[] dataFormatTypeClasses) {
+        this.dataFormatTypeClasses = dataFormatTypeClasses;
+    }
+
+    public String getMainFormatType() {
         return mainFormatType;
     }
 
     /**
-     * The classes to take into account while unmarshalling
+     * The class to take into account while unmarshalling.
      */
-    public void setMainFormatType(Class<?> mainFormatType) {
+    public void setMainFormatType(String mainFormatType) {
         this.mainFormatType = mainFormatType;
     }
 
+    public Class<?> getMainFormatTypeClass() {
+        return mainFormatTypeClass;
+    }
+
+    /**
+     * The classes to take into account while unmarshalling.
+     */
+    public void setMainFormatTypeClass(Class<?> mainFormatTypeClass) {
+        this.mainFormatTypeClass = mainFormatTypeClass;
+    }
+
     /**
      * {@code Builder} is a specific builder for {@link JsonApiDataFormat}.
      */
     @XmlTransient
     public static class Builder implements DataFormatBuilder<JsonApiDataFormat> {
 
-        private Class<?>[] dataFormatTypes;
-        private Class<?> mainFormatType;
+        private String dataFormatTypes;
+        private Class<?>[] dataFormatTypeClasses;
+        private String mainFormatType;
+        private Class<?> mainFormatTypeClass;
 
         /**
-         * The classes to take into account for the marshalling
+         * The classes to take into account for the marshalling,
          */
         public Builder dataFormatTypes(Class<?>[] dataFormatTypes) {
+            this.dataFormatTypeClasses = dataFormatTypes;
+            return this;
+        }
+
+        /**
+         * The classes (FQN name) to take into account for the marshalling.
+         * Multiple class names can be separated by comma.
+         */
+        public Builder dataFormatTypes(String dataFormatTypes) {
             this.dataFormatTypes = dataFormatTypes;
             return this;
         }
 
         /**
-         * The classes to take into account while unmarshalling
+         * The classes to take into account while unmarshalling,
          */
         public Builder mainFormatType(Class<?> mainFormatType) {
+            this.mainFormatTypeClass = mainFormatType;
+            return this;
+        }
+
+        /**
+         * The class (FQN name) to take into account while unmarshalling,
+         */
+        public Builder mainFormatType(String mainFormatType) {
             this.mainFormatType = mainFormatType;
             return this;
         }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
index 519c48c828e..58478f61aee 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/rest/RestConfigurationDefinition.java
@@ -59,8 +59,8 @@ public class RestConfigurationDefinition {
     @Metadata(label = "consumer,advanced")
     private String apiHost;
     @XmlAttribute
-    @Metadata(label = "consumer,advanced", defaultValue = "true")
-    private Boolean useXForwardHeaders;
+    @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "true")
+    private String useXForwardHeaders;
     @XmlAttribute
     @Metadata(label = "producer,advanced")
     private String producerApiDoc;
@@ -75,7 +75,7 @@ public class RestConfigurationDefinition {
     private String apiContextRouteId;
     @XmlAttribute
     @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "false")
-    private Boolean apiVendorExtension;
+    private String apiVendorExtension;
     @XmlAttribute
     @Metadata(label = "consumer,advanced", defaultValue = "allLocalIp")
     private RestHostNameResolver hostNameResolver;
@@ -84,16 +84,16 @@ public class RestConfigurationDefinition {
     private RestBindingMode bindingMode;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "false")
-    private Boolean skipBindingOnErrorCode;
+    private String skipBindingOnErrorCode;
     @XmlAttribute
     @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "false")
-    private Boolean clientRequestValidation;
+    private String clientRequestValidation;
     @XmlAttribute
     @Metadata(label = "consumer,advanced", javaType = "java.lang.Boolean", defaultValue = "false")
-    private Boolean enableCORS;
+    private String enableCORS;
     @XmlAttribute
     @Metadata(label = "consumer", javaType = "java.lang.Boolean", defaultValue = "false")
-    private Boolean inlineRoutes;
+    private String inlineRoutes;
     @XmlAttribute
     @Metadata(label = "advanced")
     private String jsonDataFormat;
@@ -272,7 +272,7 @@ public class RestConfigurationDefinition {
         this.apiContextRouteId = apiContextRouteId;
     }
 
-    public Boolean getApiVendorExtension() {
+    public String getApiVendorExtension() {
         return apiVendorExtension;
     }
 
@@ -281,7 +281,7 @@ public class RestConfigurationDefinition {
      * as vendor extension (eg keys starting with x-) such as route ids, class names etc. Not all 3rd party API gateways
      * and tools supports vendor-extensions when importing your API docs.
      */
-    public void setApiVendorExtension(Boolean apiVendorExtension) {
+    public void setApiVendorExtension(String apiVendorExtension) {
         this.apiVendorExtension = apiVendorExtension;
     }
 
@@ -310,7 +310,7 @@ public class RestConfigurationDefinition {
         this.bindingMode = bindingMode;
     }
 
-    public Boolean getSkipBindingOnErrorCode() {
+    public String getSkipBindingOnErrorCode() {
         return skipBindingOnErrorCode;
     }
 
@@ -318,11 +318,11 @@ public class RestConfigurationDefinition {
      * Whether to skip binding on output if there is a custom HTTP error code header. This allows to build custom error
      * messages that do not bind to json / xml etc, as success messages otherwise will do.
      */
-    public void setSkipBindingOnErrorCode(Boolean skipBindingOnErrorCode) {
+    public void setSkipBindingOnErrorCode(String skipBindingOnErrorCode) {
         this.skipBindingOnErrorCode = skipBindingOnErrorCode;
     }
 
-    public Boolean getClientRequestValidation() {
+    public String getClientRequestValidation() {
         return clientRequestValidation;
     }
 
@@ -334,11 +334,11 @@ public class RestConfigurationDefinition {
      * (query parameters, HTTP headers, body); returns HTTP Status 400 if validation error. 4) Parsing error of the
      * message body (JSon, XML or Auto binding mode must be enabled); returns HTTP Status 400 if validation error.
      */
-    public void setClientRequestValidation(Boolean clientRequestValidation) {
+    public void setClientRequestValidation(String clientRequestValidation) {
         this.clientRequestValidation = clientRequestValidation;
     }
 
-    public Boolean getEnableCORS() {
+    public String getEnableCORS() {
         return enableCORS;
     }
 
@@ -347,11 +347,11 @@ public class RestConfigurationDefinition {
      * <p/>
      * The default value is false.
      */
-    public void setEnableCORS(Boolean enableCORS) {
+    public void setEnableCORS(String enableCORS) {
         this.enableCORS = enableCORS;
     }
 
-    public Boolean getInlineRoutes() {
+    public String getInlineRoutes() {
         return inlineRoutes;
     }
 
@@ -364,7 +364,7 @@ public class RestConfigurationDefinition {
      *
      * This option is default <tt>false</tt>.
      */
-    public void setInlineRoutes(Boolean inlineRoutes) {
+    public void setInlineRoutes(String inlineRoutes) {
         this.inlineRoutes = inlineRoutes;
     }
 
@@ -469,7 +469,7 @@ public class RestConfigurationDefinition {
         this.corsHeaders = corsHeaders;
     }
 
-    public Boolean getUseXForwardHeaders() {
+    public String getUseXForwardHeaders() {
         return useXForwardHeaders;
     }
 
@@ -478,7 +478,7 @@ public class RestConfigurationDefinition {
      * <p/>
      * The default value is true.
      */
-    public void setUseXForwardHeaders(Boolean useXForwardHeaders) {
+    public void setUseXForwardHeaders(String useXForwardHeaders) {
         this.useXForwardHeaders = useXForwardHeaders;
     }
 
@@ -590,6 +590,16 @@ public class RestConfigurationDefinition {
      * support vendor extensions and this option can then be turned off.
      */
     public RestConfigurationDefinition apiVendorExtension(boolean vendorExtension) {
+        setApiVendorExtension(vendorExtension ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * Whether vendor extension is enabled in the Rest APIs. If enabled then Camel will include additional information
+     * as vendor extension (eg keys starting with x-) such as route ids, class names etc. Some API tooling may not
+     * support vendor extensions and this option can then be turned off.
+     */
+    public RestConfigurationDefinition apiVendorExtension(String vendorExtension) {
         setApiVendorExtension(vendorExtension);
         return this;
     }
@@ -633,6 +643,14 @@ public class RestConfigurationDefinition {
      * To specify whether to skip binding output if there is a custom HTTP error code
      */
     public RestConfigurationDefinition skipBindingOnErrorCode(boolean skipBindingOnErrorCode) {
+        setSkipBindingOnErrorCode(skipBindingOnErrorCode ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * To specify whether to skip binding output if there is a custom HTTP error code
+     */
+    public RestConfigurationDefinition skipBindingOnErrorCode(String skipBindingOnErrorCode) {
         setSkipBindingOnErrorCode(skipBindingOnErrorCode);
         return this;
     }
@@ -646,6 +664,19 @@ public class RestConfigurationDefinition {
      * message body (JSon, XML or Auto binding mode must be enabled); returns HTTP Status 400 if validation error.
      */
     public RestConfigurationDefinition clientRequestValidation(boolean clientRequestValidation) {
+        setClientRequestValidation(clientRequestValidation ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * Whether to enable validation of the client request to check:
+     *
+     * 1) Content-Type header matches what the Rest DSL consumes; returns HTTP Status 415 if validation error. 2) Accept
+     * header matches what the Rest DSL produces; returns HTTP Status 406 if validation error. 3) Missing required data
+     * (query parameters, HTTP headers, body); returns HTTP Status 400 if validation error. 4) Parsing error of the
+     * message body (JSon, XML or Auto binding mode must be enabled); returns HTTP Status 400 if validation error.
+     */
+    public RestConfigurationDefinition clientRequestValidation(String clientRequestValidation) {
         setClientRequestValidation(clientRequestValidation);
         return this;
     }
@@ -655,6 +686,15 @@ public class RestConfigurationDefinition {
      * response.
      */
     public RestConfigurationDefinition enableCORS(boolean enableCORS) {
+        setEnableCORS(enableCORS ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * To specify whether to enable CORS which means Camel will automatic include CORS in the HTTP headers in the
+     * response.
+     */
+    public RestConfigurationDefinition enableCORS(String enableCORS) {
         setEnableCORS(enableCORS);
         return this;
     }
@@ -668,11 +708,25 @@ public class RestConfigurationDefinition {
      *
      * This option is default <tt>false</tt>.
      */
-    public RestConfigurationDefinition inlineRoutes(boolean inlineRoutes) {
+    public RestConfigurationDefinition inlineRoutes(String inlineRoutes) {
         setInlineRoutes(inlineRoutes);
         return this;
     }
 
+    /**
+     * Inline routes in rest-dsl which are linked using direct endpoints.
+     *
+     * By default, each service in Rest DSL is an individual route, meaning that you would have at least two routes per
+     * service (rest-dsl, and the route linked from rest-dsl). Enabling this allows Camel to optimize and inline this as
+     * a single route, however this requires to use direct endpoints, which must be unique per service.
+     *
+     * This option is default <tt>false</tt>.
+     */
+    public RestConfigurationDefinition inlineRoutes(boolean inlineRoutes) {
+        setInlineRoutes(inlineRoutes ? "true" : "false");
+        return this;
+    }
+
     /**
      * To use a specific json data format
      * <p/>
@@ -786,6 +840,14 @@ public class RestConfigurationDefinition {
      * To specify whether to use X-Forward headers for Host and related setting
      */
     public RestConfigurationDefinition useXForwardHeaders(boolean useXForwardHeaders) {
+        setUseXForwardHeaders(useXForwardHeaders ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * To specify whether to use X-Forward headers for Host and related setting
+     */
+    public RestConfigurationDefinition useXForwardHeaders(String useXForwardHeaders) {
         setUseXForwardHeaders(useXForwardHeaders);
         return this;
     }
@@ -818,7 +880,7 @@ public class RestConfigurationDefinition {
             target.setHost(CamelContextHelper.parseText(context, host));
         }
         if (useXForwardHeaders != null) {
-            target.setUseXForwardHeaders(useXForwardHeaders);
+            target.setUseXForwardHeaders(CamelContextHelper.parseBoolean(context, useXForwardHeaders));
         }
         if (apiHost != null) {
             target.setApiHost(CamelContextHelper.parseText(context, apiHost));
@@ -836,7 +898,7 @@ public class RestConfigurationDefinition {
             target.setApiContextRouteId(CamelContextHelper.parseText(context, apiContextRouteId));
         }
         if (apiVendorExtension != null) {
-            target.setApiVendorExtension(apiVendorExtension);
+            target.setApiVendorExtension(CamelContextHelper.parseBoolean(context, apiVendorExtension));
         }
         if (contextPath != null) {
             target.setContextPath(CamelContextHelper.parseText(context, contextPath));
@@ -848,16 +910,16 @@ public class RestConfigurationDefinition {
             target.setBindingMode(bindingMode.name());
         }
         if (skipBindingOnErrorCode != null) {
-            target.setSkipBindingOnErrorCode(skipBindingOnErrorCode);
+            target.setSkipBindingOnErrorCode(CamelContextHelper.parseBoolean(context, skipBindingOnErrorCode));
         }
         if (clientRequestValidation != null) {
-            target.setClientRequestValidation(clientRequestValidation);
+            target.setClientRequestValidation(CamelContextHelper.parseBoolean(context, clientRequestValidation));
         }
         if (enableCORS != null) {
-            target.setEnableCORS(enableCORS);
+            target.setEnableCORS(CamelContextHelper.parseBoolean(context, enableCORS));
         }
         if (inlineRoutes != null) {
-            target.setInlineRoutes(inlineRoutes);
+            target.setInlineRoutes(CamelContextHelper.parseBoolean(context, inlineRoutes));
         }
         if (jsonDataFormat != null) {
             target.setJsonDataFormat(jsonDataFormat);
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonApiDataFormatReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonApiDataFormatReifier.java
index 038ae59dc61..067f4ec52bb 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonApiDataFormatReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/JsonApiDataFormatReifier.java
@@ -31,6 +31,8 @@ public class JsonApiDataFormatReifier extends DataFormatReifier<JsonApiDataForma
     @Override
     protected void prepareDataFormatConfig(Map<String, Object> properties) {
         properties.put("mainFormatType", definition.getMainFormatType());
+        properties.put("mainFormatTypeClass", definition.getMainFormatTypeClass());
         properties.put("dataFormatTypes", definition.getDataFormatTypes());
+        properties.put("dataFormatTypesClasses", definition.getDataFormatTypeClasses());
     }
 }
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 7ebd35468bf..4b7bcbab39a 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
@@ -2189,8 +2189,8 @@ public class ModelParser extends BaseParser {
     protected JsonApiDataFormat doParseJsonApiDataFormat() throws IOException, XmlPullParserException {
         return doParse(new JsonApiDataFormat(), (def, key, val) -> {
             switch (key) {
-                case "dataFormatTypes": def.setDataFormatTypes(asClassArray(val)); break;
-                case "mainFormatType": def.setMainFormatType(asClass(val)); break;
+                case "dataFormatTypes": def.setDataFormatTypes(val); break;
+                case "mainFormatType": def.setMainFormatType(val); break;
                 default: return identifiedTypeAttributeHandler().accept(def, key, val);
             }
             return true;
@@ -3093,22 +3093,22 @@ public class ModelParser extends BaseParser {
                 case "apiContextPath": def.setApiContextPath(val); break;
                 case "apiContextRouteId": def.setApiContextRouteId(val); break;
                 case "apiHost": def.setApiHost(val); break;
-                case "apiVendorExtension": def.setApiVendorExtension(Boolean.valueOf(val)); break;
+                case "apiVendorExtension": def.setApiVendorExtension(val); break;
                 case "bindingMode": def.setBindingMode(RestBindingMode.valueOf(val)); break;
-                case "clientRequestValidation": def.setClientRequestValidation(Boolean.valueOf(val)); break;
+                case "clientRequestValidation": def.setClientRequestValidation(val); break;
                 case "component": def.setComponent(val); break;
                 case "contextPath": def.setContextPath(val); break;
-                case "enableCORS": def.setEnableCORS(Boolean.valueOf(val)); break;
+                case "enableCORS": def.setEnableCORS(val); break;
                 case "host": def.setHost(val); break;
                 case "hostNameResolver": def.setHostNameResolver(RestHostNameResolver.valueOf(val)); break;
-                case "inlineRoutes": def.setInlineRoutes(Boolean.valueOf(val)); break;
+                case "inlineRoutes": def.setInlineRoutes(val); break;
                 case "jsonDataFormat": def.setJsonDataFormat(val); break;
                 case "port": def.setPort(val); break;
                 case "producerApiDoc": def.setProducerApiDoc(val); break;
                 case "producerComponent": def.setProducerComponent(val); break;
                 case "scheme": def.setScheme(val); break;
-                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(Boolean.valueOf(val)); break;
-                case "useXForwardHeaders": def.setUseXForwardHeaders(Boolean.valueOf(val)); break;
+                case "skipBindingOnErrorCode": def.setSkipBindingOnErrorCode(val); break;
+                case "useXForwardHeaders": def.setUseXForwardHeaders(val); break;
                 case "xmlDataFormat": def.setXmlDataFormat(val); break;
                 default: return false;
             }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 68d64201383..ad55601d3c8 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -7325,6 +7325,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
             types = org.apache.camel.model.dataformat.JsonApiDataFormat.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             properties = {
+                    @YamlProperty(name = "data-format-types", type = "string"),
                     @YamlProperty(name = "id", type = "string"),
                     @YamlProperty(name = "main-format-type", type = "string")
             }
@@ -7344,7 +7345,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 String propertyName, Node node) {
             switch(propertyKey) {
                 case "data-format-types": {
-                    java.lang.Class<?>[] val = asClassArray(node);
+                    String val = asText(node);
                     target.setDataFormatTypes(val);
                     break;
                 }
@@ -7354,7 +7355,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                     break;
                 }
                 case "main-format-type": {
-                    java.lang.Class<?> val = asClass(node);
+                    String val = asText(node);
                     target.setMainFormatType(val);
                     break;
                 }
@@ -12521,7 +12522,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 }
                 case "api-vendor-extension": {
                     String val = asText(node);
-                    target.setApiVendorExtension(java.lang.Boolean.valueOf(val));
+                    target.setApiVendorExtension(val);
                     break;
                 }
                 case "binding-mode": {
@@ -12530,7 +12531,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 }
                 case "client-request-validation": {
                     String val = asText(node);
-                    target.setClientRequestValidation(java.lang.Boolean.valueOf(val));
+                    target.setClientRequestValidation(val);
                     break;
                 }
                 case "component": {
@@ -12565,7 +12566,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 }
                 case "enable-cors": {
                     String val = asText(node);
-                    target.setEnableCORS(java.lang.Boolean.valueOf(val));
+                    target.setEnableCORS(val);
                     break;
                 }
                 case "endpoint-property": {
@@ -12584,7 +12585,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 }
                 case "inline-routes": {
                     String val = asText(node);
-                    target.setInlineRoutes(java.lang.Boolean.valueOf(val));
+                    target.setInlineRoutes(val);
                     break;
                 }
                 case "json-data-format": {
@@ -12614,12 +12615,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
                 }
                 case "skip-binding-on-error-code": {
                     String val = asText(node);
-                    target.setSkipBindingOnErrorCode(java.lang.Boolean.valueOf(val));
+                    target.setSkipBindingOnErrorCode(val);
                     break;
                 }
                 case "use-x-forward-headers": {
                     String val = asText(node);
-                    target.setUseXForwardHeaders(java.lang.Boolean.valueOf(val));
+                    target.setUseXForwardHeaders(val);
                     break;
                 }
                 case "xml-data-format": {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
index d02550e85ce..80b7a75fac0 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
@@ -5209,6 +5209,9 @@
       "org.apache.camel.model.dataformat.JsonApiDataFormat" : {
         "type" : "object",
         "properties" : {
+          "data-format-types" : {
+            "type" : "string"
+          },
           "id" : {
             "type" : "string"
           },
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index ade3274d14e..c65b2e838bd 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -5113,6 +5113,9 @@
       "org.apache.camel.model.dataformat.JsonApiDataFormat" : {
         "type" : "object",
         "properties" : {
+          "dataFormatTypes" : {
+            "type" : "string"
+          },
           "id" : {
             "type" : "string"
           },