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 5a793c143af0 CAMEL-25054: camel-jackson3 - enable/disable features in 
a qualified manner (#26937)
5a793c143af0 is described below

commit 5a793c143af074c7db2c7f515e2857606b138f75
Author: Benjamin Graf <[email protected]>
AuthorDate: Wed Sep 30 18:55:25 2026 +0200

    CAMEL-25054: camel-jackson3 - enable/disable features in a qualified manner 
(#26937)
    
    Follow up to CAMEL-24620. Jackson 3 split its features across several enum 
types with overlapping names, so the enableFeatures/disableFeatures options of 
the JSON data format now accept features qualified by their enum type, allowing 
an unambiguous choice. Includes tests and regenerated model, catalog and DSL 
metadata.
    
    Closes #26937
---
 .../apache/camel/catalog/dataformats/jackson.json  |   4 +-
 .../org/apache/camel/catalog/models/json.json      |   4 +-
 .../apache/camel/catalog/schemas/camel-spring.xsd  |   6 +-
 .../apache/camel/catalog/schemas/camel-xml-io.xsd  |   6 +-
 .../camel/catalog/schemas/camelYamlDsl-model.json  |   4 +-
 .../apache/camel/component/jackson/jackson.json    |   4 +-
 .../apache/camel/component/jackson3/jackson.json   |   4 +-
 .../jackson3/AbstractJacksonDataFormat.java        | 328 ++++++++++++---------
 .../component/jackson3/JacksonFeaturesTest.java    |  63 ++++
 .../org/apache/camel/model/dataformat/json.json    |   4 +-
 .../camel/model/dataformat/JsonDataFormat.java     |   6 +-
 .../dsl/yaml/deserializers/ModelDeserializers.java |   4 +-
 .../resources/schema/camelYamlDsl-canonical.json   |   4 +-
 .../resources/schema/camelYamlDsl-model.json       |   4 +-
 .../generated/resources/schema/camelYamlDsl.json   |   4 +-
 15 files changed, 287 insertions(+), 162 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/jackson.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/jackson.json
index eb263c4bf7ee..945a08984b3b 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/jackson.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/jackson.json
@@ -30,8 +30,8 @@
     "useList": { "index": 11, "kind": "attribute", "displayName": "Use List", 
"group": "common", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "To unmarshal to a List of Map or a List 
of Pojo." },
     "moduleClassNames": { "index": 12, "kind": "attribute", "displayName": 
"Module Class Names", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use custom Jackson 
modules com.fasterxml.jackson.databind.Module specified as a String with FQN 
class names. Multiple classes can be separated by comma." },
     "moduleRefs": { "index": 13, "kind": "attribute", "displayName": "Module 
Refs", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use custom Jackson modules referred 
from the Camel registry. Multiple modules can be separated by comma." },
-    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
-    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
+    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. Seri [...]
+    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. S [...]
     "allowUnmarshallType": { "index": 16, "kind": "attribute", "displayName": 
"Allow Unmarshall Type", "group": "common", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header 
during the unmarshalling. This should only be enabled when desired to be used." 
},
     "timezone": { "index": 17, "kind": "attribute", "displayName": "Timezone", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "If set then Jackson will use the Timezone when 
marshalling\/unmarshalling." },
     "schemaResolver": { "index": 18, "kind": "attribute", "displayName": 
"Schema Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.jackson.SchemaResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "Optional schema resolver 
used to lookup schemas for the data in transit." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/json.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/json.json
index f42ba35001f4..ebabe678aede 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/json.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/json.json
@@ -27,8 +27,8 @@
     "useList": { "index": 12, "kind": "attribute", "displayName": "Use List", 
"group": "common", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "To unmarshal to a List of Map or a List 
of Pojo." },
     "moduleClassNames": { "index": 13, "kind": "attribute", "displayName": 
"Module Class Names", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use custom Jackson 
modules com.fasterxml.jackson.databind.Module specified as a String with FQN 
class names. Multiple classes can be separated by comma." },
     "moduleRefs": { "index": 14, "kind": "attribute", "displayName": "Module 
Refs", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use custom Jackson modules referred 
from the Camel registry. Multiple modules can be separated by comma." },
-    "enableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
-    "disableFeatures": { "index": 16, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
+    "enableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. Seri [...]
+    "disableFeatures": { "index": 16, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. S [...]
     "allowUnmarshallType": { "index": 17, "kind": "attribute", "displayName": 
"Allow Unmarshall Type", "group": "common", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header 
during the unmarshalling. This should only be enabled when desired to be used." 
},
     "timezone": { "index": 18, "kind": "attribute", "displayName": "Timezone", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "If set then Jackson will use the Timezone when 
marshalling\/unmarshalling." },
     "schemaResolver": { "index": 19, "kind": "attribute", "displayName": 
"Schema Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.jackson.SchemaResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "Optional schema resolver 
used to lookup schemas for the data in transit." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index 8a2094f0800b..d253e483968d 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -9327,7 +9327,8 @@ To use custom Jackson modules referred from the Camel 
registry. Multiple modules
             <xs:documentation xml:lang="en">
 <![CDATA[
 Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated
-by comma.
+by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g.
+SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with the same 
name.
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -9337,7 +9338,8 @@ by comma.
             <xs:documentation xml:lang="en">
 <![CDATA[
 Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be
-separated by comma.
+separated by comma. When using Jackson 3, a feature can be qualified with its 
enum class name (e.g.
+SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with the same 
name.
 ]]>
             </xs:documentation>
           </xs:annotation>
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd
index d925ea5aeaee..f67bb6ff9ca6 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd
@@ -8449,7 +8449,8 @@ To use custom Jackson modules referred from the Camel 
registry. Multiple modules
             <xs:documentation xml:lang="en">
 <![CDATA[
 Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated
-by comma.
+by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g.
+SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with the same 
name.
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -8459,7 +8460,8 @@ by comma.
             <xs:documentation xml:lang="en">
 <![CDATA[
 Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be
-separated by comma.
+separated by comma. When using Jackson 3, a feature can be qualified with its 
enum class name (e.g.
+SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with the same 
name.
 ]]>
             </xs:documentation>
           </xs:annotation>
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json
index d14e31756b49..320e9d67ea9f 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json
@@ -12677,7 +12677,7 @@
       }, {
         "name" : "enableFeatures",
         "type" : "string",
-        "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.",
+        "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.",
         "title" : "Enable Features",
         "displayName" : "Enable Features",
         "kind" : "attribute",
@@ -12687,7 +12687,7 @@
       }, {
         "name" : "disableFeatures",
         "type" : "string",
-        "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.",
+        "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.",
         "title" : "Disable Features",
         "displayName" : "Disable Features",
         "kind" : "attribute",
diff --git 
a/components/camel-jackson/src/generated/resources/META-INF/org/apache/camel/component/jackson/jackson.json
 
b/components/camel-jackson/src/generated/resources/META-INF/org/apache/camel/component/jackson/jackson.json
index eb263c4bf7ee..945a08984b3b 100644
--- 
a/components/camel-jackson/src/generated/resources/META-INF/org/apache/camel/component/jackson/jackson.json
+++ 
b/components/camel-jackson/src/generated/resources/META-INF/org/apache/camel/component/jackson/jackson.json
@@ -30,8 +30,8 @@
     "useList": { "index": 11, "kind": "attribute", "displayName": "Use List", 
"group": "common", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "To unmarshal to a List of Map or a List 
of Pojo." },
     "moduleClassNames": { "index": 12, "kind": "attribute", "displayName": 
"Module Class Names", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use custom Jackson 
modules com.fasterxml.jackson.databind.Module specified as a String with FQN 
class names. Multiple classes can be separated by comma." },
     "moduleRefs": { "index": 13, "kind": "attribute", "displayName": "Module 
Refs", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use custom Jackson modules referred 
from the Camel registry. Multiple modules can be separated by comma." },
-    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
-    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
+    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. Seri [...]
+    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. S [...]
     "allowUnmarshallType": { "index": 16, "kind": "attribute", "displayName": 
"Allow Unmarshall Type", "group": "common", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header 
during the unmarshalling. This should only be enabled when desired to be used." 
},
     "timezone": { "index": 17, "kind": "attribute", "displayName": "Timezone", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "If set then Jackson will use the Timezone when 
marshalling\/unmarshalling." },
     "schemaResolver": { "index": 18, "kind": "attribute", "displayName": 
"Schema Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.jackson.SchemaResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "Optional schema resolver 
used to lookup schemas for the data in transit." },
diff --git 
a/components/camel-jackson3/src/generated/resources/META-INF/org/apache/camel/component/jackson3/jackson.json
 
b/components/camel-jackson3/src/generated/resources/META-INF/org/apache/camel/component/jackson3/jackson.json
index 501ba1bfef33..ba1d41ca01f0 100644
--- 
a/components/camel-jackson3/src/generated/resources/META-INF/org/apache/camel/component/jackson3/jackson.json
+++ 
b/components/camel-jackson3/src/generated/resources/META-INF/org/apache/camel/component/jackson3/jackson.json
@@ -30,8 +30,8 @@
     "useList": { "index": 11, "kind": "attribute", "displayName": "Use List", 
"group": "common", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "To unmarshal to a List of Map or a List 
of Pojo." },
     "moduleClassNames": { "index": 12, "kind": "attribute", "displayName": 
"Module Class Names", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use custom Jackson 
modules com.fasterxml.jackson.databind.Module specified as a String with FQN 
class names. Multiple classes can be separated by comma." },
     "moduleRefs": { "index": 13, "kind": "attribute", "displayName": "Module 
Refs", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use custom Jackson modules referred 
from the Camel registry. Multiple modules can be separated by comma." },
-    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
-    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
+    "enableFeatures": { "index": 14, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. Seri [...]
+    "disableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. S [...]
     "allowUnmarshallType": { "index": 16, "kind": "attribute", "displayName": 
"Allow Unmarshall Type", "group": "common", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header 
during the unmarshalling. This should only be enabled when desired to be used." 
},
     "timezone": { "index": 17, "kind": "attribute", "displayName": "Timezone", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "If set then Jackson will use the Timezone when 
marshalling\/unmarshalling." },
     "schemaResolver": { "index": 18, "kind": "attribute", "displayName": 
"Schema Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.jackson.SchemaResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "Optional schema resolver 
used to lookup schemas for the data in transit." },
diff --git 
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/AbstractJacksonDataFormat.java
 
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/AbstractJacksonDataFormat.java
index e726d00c91a8..3735892fee59 100644
--- 
a/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/AbstractJacksonDataFormat.java
+++ 
b/components/camel-jackson3/src/main/java/org/apache/camel/component/jackson3/AbstractJacksonDataFormat.java
@@ -417,7 +417,7 @@ public abstract class AbstractJacksonDataFormat extends 
ServiceSupport
      * Allows jackson to use the <tt>JMSType</tt> header as an indicator what 
the classname is for unmarshaling content
      * to POJO
      * <p/>
-     * By default this option is <tt>false</tt>.
+     * By default, this option is <tt>false</tt>.
      */
     public void setAllowJmsType(boolean allowJmsType) {
         this.allowJmsType = allowJmsType;
@@ -541,97 +541,97 @@ public abstract class AbstractJacksonDataFormat extends 
ServiceSupport
 
     public void enableFeature(SerializationFeature feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void enableFeature(DeserializationFeature feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void enableFeature(MapperFeature feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void enableFeature(Enum<? extends DatatypeFeature> feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void enableFeature(StreamReadFeature feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void enableFeature(StreamWriteFeature feature) {
         if (enableFeatures == null) {
-            enableFeatures = feature.name();
+            enableFeatures = feature.getDeclaringClass().getSimpleName() + "." 
+ feature.name();
         } else {
-            enableFeatures += "," + feature.name();
+            enableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(SerializationFeature feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(DeserializationFeature feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(MapperFeature feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(Enum<? extends DatatypeFeature> feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(StreamReadFeature feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
     public void disableFeature(StreamWriteFeature feature) {
         if (disableFeatures == null) {
-            disableFeatures = feature.name();
+            disableFeatures = feature.getDeclaringClass().getSimpleName() + 
"." + feature.name();
         } else {
-            disableFeatures += "," + feature.name();
+            disableFeatures += "," + 
feature.getDeclaringClass().getSimpleName() + "." + feature.name();
         }
     }
 
@@ -675,7 +675,7 @@ public abstract class AbstractJacksonDataFormat extends 
ServiceSupport
             }
 
             if (enableFeatures != null) {
-                doEnableFeaures();
+                doEnableFeatures();
             }
             if (disableFeatures != null) {
                 doDisableFeatures();
@@ -737,64 +737,181 @@ public abstract class AbstractJacksonDataFormat extends 
ServiceSupport
         return objectMapperFoundRegistry;
     }
 
-    private void doEnableFeaures() {
+    private boolean trySetSerializationFeature(String featureValueName, 
boolean state) {
+        SerializationFeature feature
+                = 
getCamelContext().getTypeConverter().tryConvertTo(SerializationFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetDeserializationFeature(String featureValueName, 
boolean state) {
+        DeserializationFeature feature
+                = 
getCamelContext().getTypeConverter().tryConvertTo(DeserializationFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetMapperFeature(String featureValueName, boolean 
state) {
+        MapperFeature feature = 
getCamelContext().getTypeConverter().tryConvertTo(MapperFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetDateTimeFeature(String featureValueName, boolean 
state) {
+        DateTimeFeature feature = 
getCamelContext().getTypeConverter().tryConvertTo(DateTimeFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetEnumFeature(String featureValueName, boolean state) {
+        EnumFeature feature = 
getCamelContext().getTypeConverter().tryConvertTo(EnumFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetJsonNodeFeature(String featureValueName, boolean 
state) {
+        JsonNodeFeature feature = 
getCamelContext().getTypeConverter().tryConvertTo(JsonNodeFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetStreamReadFeature(String featureValueName, boolean 
state) {
+        StreamReadFeature feature
+                = 
getCamelContext().getTypeConverter().tryConvertTo(StreamReadFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private boolean trySetStreamWriteFeature(String featureValueName, boolean 
state) {
+        StreamWriteFeature feature
+                = 
getCamelContext().getTypeConverter().tryConvertTo(StreamWriteFeature.class, 
featureValueName);
+        if (feature == null) {
+            return false;
+        }
+        setObjectMapper(objectMapper.rebuild().configure(feature, 
state).build());
+        return true;
+    }
+
+    private void doEnableFeatures() {
         Iterator<?> it = ObjectHelper.createIterator(enableFeatures);
         while (it.hasNext()) {
             String enable = it.next().toString();
-            // it can be different kind
-            SerializationFeature sf
-                    = 
getCamelContext().getTypeConverter().tryConvertTo(SerializationFeature.class, 
enable);
-            if (sf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(sf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            DeserializationFeature df
-                    = 
getCamelContext().getTypeConverter().tryConvertTo(DeserializationFeature.class, 
enable);
-            if (df != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(df).build();
-                setObjectMapper(om);
-                continue;
-            }
-            MapperFeature mf = 
getCamelContext().getTypeConverter().tryConvertTo(MapperFeature.class, enable);
-            if (mf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(mf).build();
-                setObjectMapper(om);
-                continue;
+            long dotCount = enable.chars().filter(ch -> ch == '.').count();
+            if (dotCount > 1) {
+                throw new IllegalArgumentException("Enable feature: " + enable 
+ " cannot contain more than one '.'");
             }
-            DateTimeFeature dtf = 
getCamelContext().getTypeConverter().tryConvertTo(DateTimeFeature.class, 
enable);
-            if (dtf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(dtf).build();
-                setObjectMapper(om);
-                continue;
+
+            String featureClassName = null;
+            String featureValueName = enable;
+
+            if (dotCount == 1) {
+                String[] parts = enable.split("\\.", 2);
+                featureClassName = parts[0];
+                featureValueName = parts[1];
             }
-            EnumFeature ef = 
getCamelContext().getTypeConverter().tryConvertTo(EnumFeature.class, enable);
-            if (ef != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(ef).build();
-                setObjectMapper(om);
-                continue;
+
+            if (featureClassName != null) {
+                if (!switch (featureClassName) {
+                    case "SerializationFeature" -> 
trySetSerializationFeature(featureValueName, true);
+                    case "DeserializationFeature" -> 
trySetDeserializationFeature(featureValueName, true);
+                    case "MapperFeature" -> 
trySetMapperFeature(featureValueName, true);
+                    case "DateTimeFeature" -> 
trySetDateTimeFeature(featureValueName, true);
+                    case "EnumFeature" -> trySetEnumFeature(featureValueName, 
true);
+                    case "JsonNodeFeature" -> 
trySetJsonNodeFeature(featureValueName, true);
+                    case "StreamReadFeature" -> 
trySetStreamReadFeature(featureValueName, true);
+                    case "StreamWriteFeature" -> 
trySetStreamWriteFeature(featureValueName, true);
+                    default -> false;
+                }) {
+                    throw new IllegalArgumentException(
+                            "Enable feature: " + enable
+                                                       + " cannot be converted 
to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
+                }
+            } else {
+                if (!trySetSerializationFeature(featureValueName, true)
+                        && !trySetDeserializationFeature(featureValueName, 
true)
+                        && !trySetMapperFeature(featureValueName, true)
+                        && !trySetDateTimeFeature(featureValueName, true)
+                        && !trySetEnumFeature(featureValueName, true)
+                        && !trySetJsonNodeFeature(featureValueName, true)
+                        && !trySetStreamReadFeature(featureValueName, true)
+                        && !trySetStreamWriteFeature(featureValueName, true)) {
+                    throw new IllegalArgumentException(
+                            "Enable feature: " + featureValueName
+                                                       + " cannot be converted 
to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
+                }
             }
-            JsonNodeFeature jnf = 
getCamelContext().getTypeConverter().tryConvertTo(JsonNodeFeature.class, 
enable);
-            if (jnf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(jnf).build();
-                setObjectMapper(om);
-                continue;
+        }
+    }
+
+    private void doDisableFeatures() {
+        Iterator<?> it = ObjectHelper.createIterator(disableFeatures);
+        while (it.hasNext()) {
+            String disable = it.next().toString();
+            long dotCount = disable.chars().filter(ch -> ch == '.').count();
+            if (dotCount > 1) {
+                throw new IllegalArgumentException("Disable feature: " + 
disable + " cannot contain more than one '.'");
             }
-            StreamReadFeature srf = 
getCamelContext().getTypeConverter().tryConvertTo(StreamReadFeature.class, 
enable);
-            if (srf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(srf).build();
-                setObjectMapper(om);
-                continue;
+
+            String featureClassName = null;
+            String featureValueName = disable;
+
+            if (dotCount == 1) {
+                String[] parts = disable.split("\\.", 2);
+                featureClassName = parts[0];
+                featureValueName = parts[1];
             }
-            StreamWriteFeature swf = 
getCamelContext().getTypeConverter().tryConvertTo(StreamWriteFeature.class, 
enable);
-            if (swf != null) {
-                ObjectMapper om = objectMapper.rebuild().enable(swf).build();
-                setObjectMapper(om);
-                continue;
+
+            if (featureClassName != null) {
+                if (!switch (featureClassName) {
+                    case "SerializationFeature" -> 
trySetSerializationFeature(featureValueName, false);
+                    case "DeserializationFeature" -> 
trySetDeserializationFeature(featureValueName, false);
+                    case "MapperFeature" -> 
trySetMapperFeature(featureValueName, false);
+                    case "DateTimeFeature" -> 
trySetDateTimeFeature(featureValueName, false);
+                    case "EnumFeature" -> trySetEnumFeature(featureValueName, 
false);
+                    case "JsonNodeFeature" -> 
trySetJsonNodeFeature(featureValueName, false);
+                    case "StreamReadFeature" -> 
trySetStreamReadFeature(featureValueName, false);
+                    case "StreamWriteFeature" -> 
trySetStreamWriteFeature(featureValueName, false);
+                    default -> false;
+                }) {
+                    throw new IllegalArgumentException(
+                            "Disable feature: " + disable
+                                                       + " cannot be converted 
to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
+                }
+            } else {
+                if (!trySetSerializationFeature(featureValueName, false)
+                        && !trySetDeserializationFeature(featureValueName, 
false)
+                        && !trySetMapperFeature(featureValueName, false)
+                        && !trySetDateTimeFeature(featureValueName, false)
+                        && !trySetEnumFeature(featureValueName, false)
+                        && !trySetJsonNodeFeature(featureValueName, false)
+                        && !trySetStreamReadFeature(featureValueName, false)
+                        && !trySetStreamWriteFeature(featureValueName, false)) 
{
+                    throw new IllegalArgumentException(
+                            "Disable feature: " + featureValueName
+                                                       + " cannot be converted 
to an accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
+                }
             }
-            throw new IllegalArgumentException(
-                    "Enable feature: " + enable
-                                               + " cannot be converted to an 
accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
         }
     }
 
@@ -868,67 +985,6 @@ public abstract class AbstractJacksonDataFormat extends 
ServiceSupport
         }
     }
 
-    private void doDisableFeatures() {
-        Iterator<?> it = ObjectHelper.createIterator(disableFeatures);
-        while (it.hasNext()) {
-            String disable = it.next().toString();
-            // it can be different kind
-            SerializationFeature sf
-                    = 
getCamelContext().getTypeConverter().tryConvertTo(SerializationFeature.class, 
disable);
-            if (sf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(sf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            DeserializationFeature df
-                    = 
getCamelContext().getTypeConverter().tryConvertTo(DeserializationFeature.class, 
disable);
-            if (df != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(df).build();
-                setObjectMapper(om);
-                continue;
-            }
-            MapperFeature mf = 
getCamelContext().getTypeConverter().tryConvertTo(MapperFeature.class, disable);
-            if (mf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(mf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            DateTimeFeature dtf = 
getCamelContext().getTypeConverter().tryConvertTo(DateTimeFeature.class, 
disable);
-            if (dtf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(dtf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            EnumFeature ef = 
getCamelContext().getTypeConverter().tryConvertTo(EnumFeature.class, disable);
-            if (ef != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(ef).build();
-                setObjectMapper(om);
-                continue;
-            }
-            JsonNodeFeature jnf = 
getCamelContext().getTypeConverter().tryConvertTo(JsonNodeFeature.class, 
disable);
-            if (jnf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(jnf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            StreamReadFeature srf = 
getCamelContext().getTypeConverter().tryConvertTo(StreamReadFeature.class, 
disable);
-            if (srf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(srf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            StreamWriteFeature swf = 
getCamelContext().getTypeConverter().tryConvertTo(StreamWriteFeature.class, 
disable);
-            if (swf != null) {
-                ObjectMapper om = objectMapper.rebuild().disable(swf).build();
-                setObjectMapper(om);
-                continue;
-            }
-            throw new IllegalArgumentException(
-                    "Disable feature: " + disable
-                                               + " cannot be converted to an 
accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]");
-        }
-    }
-
     private PropertyNamingStrategy determineNamingStrategy(String 
namingStrategy) {
         PropertyNamingStrategy strategy = null;
         switch (namingStrategy) {
diff --git 
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonFeaturesTest.java
 
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonFeaturesTest.java
index 93c6846cc5b2..c35f75ca987e 100644
--- 
a/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonFeaturesTest.java
+++ 
b/components/camel-jackson3/src/test/java/org/apache/camel/component/jackson3/JacksonFeaturesTest.java
@@ -23,14 +23,77 @@ import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.test.junit6.CamelTestSupport;
 import org.junit.jupiter.api.Test;
+import tools.jackson.core.StreamReadFeature;
 import tools.jackson.core.StreamWriteFeature;
 import tools.jackson.databind.DeserializationFeature;
 import tools.jackson.databind.MapperFeature;
 import tools.jackson.databind.SerializationFeature;
 import tools.jackson.databind.cfg.DateTimeFeature;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class JacksonFeaturesTest extends CamelTestSupport {
 
+    @Test
+    public void testEnableWrongSyntaxOfFeature() throws Exception {
+        JacksonDataFormat format = new JacksonDataFormat();
+        format.setEnableFeatures("Package.Enum.FEATURE");
+        format.setCamelContext(context());
+        IllegalArgumentException ex = 
assertThrows(IllegalArgumentException.class, () -> format.doStart());
+        assertEquals("Enable feature: Package.Enum.FEATURE cannot contain more 
than one '.'", ex.getMessage());
+    }
+
+    @Test
+    public void testEnableWrongTypedFeatureWithClassName() throws Exception {
+        JacksonDataFormat format = new JacksonDataFormat();
+        format.setEnableFeatures("Enum.FEATURE");
+        format.setCamelContext(context());
+        IllegalArgumentException ex = 
assertThrows(IllegalArgumentException.class, () -> format.doStart());
+        assertEquals(
+                "Enable feature: Enum.FEATURE cannot be converted to an 
accepted enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]",
+                ex.getMessage());
+    }
+
+    @Test
+    public void testEnableWrongTypedFeatureWithoutClassName() throws Exception 
{
+        JacksonDataFormat format = new JacksonDataFormat();
+        format.setEnableFeatures("FEATURE");
+        format.setCamelContext(context());
+        IllegalArgumentException ex = 
assertThrows(IllegalArgumentException.class, () -> format.doStart());
+        assertEquals(
+                "Enable feature: FEATURE cannot be converted to an accepted 
enum of types 
[SerializationFeature,DeserializationFeature,MapperFeature,DateTimeFeature,EnumFeature,JsonNodeFeature,StreamReadFeature,StreamWriteFeature]",
+                ex.getMessage());
+    }
+
+    @Test
+    public void testEnableStrictDuplicateDetectionFromDifferentFeatures() 
throws Exception {
+        // Initialization by implementation order (StreamReadFeature before 
StreamWriteFeature)
+        JacksonDataFormat format1 = new JacksonDataFormat();
+        format1.setEnableFeatures("STRICT_DUPLICATE_DETECTION");
+        format1.setCamelContext(context());
+        format1.doStart();
+        
assertTrue(format1.getObjectMapper().isEnabled(StreamReadFeature.STRICT_DUPLICATE_DETECTION));
+        
assertFalse(format1.getObjectMapper().isEnabled(StreamWriteFeature.STRICT_DUPLICATE_DETECTION));
+
+        // Explicit declaration of implementing feature set
+        JacksonDataFormat format2 = new JacksonDataFormat();
+        
format2.setEnableFeatures("StreamReadFeature.STRICT_DUPLICATE_DETECTION");
+        format2.setCamelContext(context());
+        format2.doStart();
+        
assertTrue(format2.getObjectMapper().isEnabled(StreamReadFeature.STRICT_DUPLICATE_DETECTION));
+        
assertFalse(format2.getObjectMapper().isEnabled(StreamWriteFeature.STRICT_DUPLICATE_DETECTION));
+
+        JacksonDataFormat format3 = new JacksonDataFormat();
+        
format3.setEnableFeatures("StreamWriteFeature.STRICT_DUPLICATE_DETECTION");
+        format3.setCamelContext(context());
+        format3.doStart();
+        
assertFalse(format3.getObjectMapper().isEnabled(StreamReadFeature.STRICT_DUPLICATE_DETECTION));
+        
assertTrue(format3.getObjectMapper().isEnabled(StreamWriteFeature.STRICT_DUPLICATE_DETECTION));
+    }
+
     @Test
     public void testEnableDeserializationFeature() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
diff --git 
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/json.json
 
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/json.json
index f42ba35001f4..ebabe678aede 100644
--- 
a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/json.json
+++ 
b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/json.json
@@ -27,8 +27,8 @@
     "useList": { "index": 12, "kind": "attribute", "displayName": "Use List", 
"group": "common", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "To unmarshal to a List of Map or a List 
of Pojo." },
     "moduleClassNames": { "index": 13, "kind": "attribute", "displayName": 
"Module Class Names", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use custom Jackson 
modules com.fasterxml.jackson.databind.Module specified as a String with FQN 
class names. Multiple classes can be separated by comma." },
     "moduleRefs": { "index": 14, "kind": "attribute", "displayName": "Module 
Refs", "group": "advanced", "label": "advanced", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use custom Jackson modules referred 
from the Camel registry. Multiple modules can be separated by comma." },
-    "enableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
-    "disableFeatures": { "index": 16, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma." },
+    "enableFeatures": { "index": 15, "kind": "attribute", "displayName": 
"Enable Features", "group": "advanced", "label": "advanced", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to enable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. Seri [...]
+    "disableFeatures": { "index": 16, "kind": "attribute", "displayName": 
"Disable Features", "group": "advanced", "label": "advanced", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Set of features to disable 
on the Jackson com.fasterxml.jackson.databind.ObjectMapper. Multiple features 
can be separated by comma. When using Jackson 3, a feature can be qualified 
with its enum class name (e.g. S [...]
     "allowUnmarshallType": { "index": 17, "kind": "attribute", "displayName": 
"Allow Unmarshall Type", "group": "common", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header 
during the unmarshalling. This should only be enabled when desired to be used." 
},
     "timezone": { "index": 18, "kind": "attribute", "displayName": "Timezone", 
"group": "advanced", "label": "advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "If set then Jackson will use the Timezone when 
marshalling\/unmarshalling." },
     "schemaResolver": { "index": 19, "kind": "attribute", "displayName": 
"Schema Resolver", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.jackson.SchemaResolver", "deprecated": false, 
"autowired": false, "secret": false, "description": "Optional schema resolver 
used to lookup schemas for the data in transit." },
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
index addd9ccd0c67..76a92bbb0b45 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/JsonDataFormat.java
@@ -100,11 +100,13 @@ public class JsonDataFormat extends DataFormatDefinition 
implements ContentTypeH
     private String moduleRefs;
     @XmlAttribute
     @Metadata(label = "advanced",
-              description = "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.")
+              description = "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+                            + " When using Jackson 3, a feature can be 
qualified with its enum class name (e.g. SerializationFeature.WRAP_ROOT_VALUE) 
to tell apart features with the same name.")
     private String enableFeatures;
     @XmlAttribute
     @Metadata(label = "advanced",
-              description = "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.")
+              description = "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+                            + " When using Jackson 3, a feature can be 
qualified with its enum class name (e.g. SerializationFeature.WRAP_ROOT_VALUE) 
to tell apart features with the same name.")
     private String disableFeatures;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean",
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 883bd2d30b8d..6601855fc940 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
@@ -8198,8 +8198,8 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     @YamlProperty(name = "combineUnicodeSurrogates", type = 
"boolean", defaultValue = "false", description = "Force generator that outputs 
JSON content to combine surrogate pairs (if any) into 4-byte characters. This 
should be preferred when using 4-byte characters such as Japanese.", 
displayName = "Combine Unicode Surrogates"),
                     @YamlProperty(name = "contentTypeHeader", type = 
"boolean", defaultValue = "true", description = "Whether the data format should 
set the Content-Type header with the type from the data format. For example 
application/xml for data formats marshalling to XML, or application/json for 
data formats marshalling to JSON", displayName = "Content Type Header"),
                     @YamlProperty(name = "dateFormatPattern", type = "string", 
description = "To configure the date format while marshall or unmarshall Date 
fields in JSON using Gson", displayName = "Date Format Pattern"),
-                    @YamlProperty(name = "disableFeatures", type = "string", 
description = "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.", displayName = "Disable Features"),
-                    @YamlProperty(name = "enableFeatures", type = "string", 
description = "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.", displayName = "Enable Features"),
+                    @YamlProperty(name = "disableFeatures", type = "string", 
description = "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.", displayName = "Disable Features"),
+                    @YamlProperty(name = "enableFeatures", type = "string", 
description = "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.", displayName = "Enable Features"),
                     @YamlProperty(name = "id", type = "string", description = 
"The id of this node", displayName = "Id"),
                     @YamlProperty(name = "include", type = "string", 
description = "If you want to marshal a POJO to JSON, and the POJO has some 
fields with null values. And you want to skip these null values, you can set 
this option to NON_NULL.", displayName = "Include"),
                     @YamlProperty(name = "jsonView", type = "string", 
description = "When marshalling a POJO to JSON you might want to exclude 
certain fields from the JSON output. With Jackson you can use JSON views to 
accomplish this. This option is to refer to the class which has JsonView 
annotations.", displayName = "Json View"),
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
index 1e6fd6f8c93d..86b49fb70073 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json
@@ -7951,12 +7951,12 @@
           "disableFeatures" : {
             "type" : "string",
             "title" : "Disable Features",
-            "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+            "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name."
           },
           "enableFeatures" : {
             "type" : "string",
             "title" : "Enable Features",
-            "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+            "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name."
           },
           "id" : {
             "type" : "string",
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json
index d14e31756b49..320e9d67ea9f 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json
@@ -12677,7 +12677,7 @@
       }, {
         "name" : "enableFeatures",
         "type" : "string",
-        "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.",
+        "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.",
         "title" : "Enable Features",
         "displayName" : "Enable Features",
         "kind" : "attribute",
@@ -12687,7 +12687,7 @@
       }, {
         "name" : "disableFeatures",
         "type" : "string",
-        "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma.",
+        "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name.",
         "title" : "Disable Features",
         "displayName" : "Disable Features",
         "kind" : "attribute",
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 b998d8b107b7..8561e8fbf1b5 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
@@ -10138,12 +10138,12 @@
           "disableFeatures" : {
             "type" : "string",
             "title" : "Disable Features",
-            "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+            "description" : "Set of features to disable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name."
           },
           "enableFeatures" : {
             "type" : "string",
             "title" : "Enable Features",
-            "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma."
+            "description" : "Set of features to enable on the Jackson 
com.fasterxml.jackson.databind.ObjectMapper. Multiple features can be separated 
by comma. When using Jackson 3, a feature can be qualified with its enum class 
name (e.g. SerializationFeature.WRAP_ROOT_VALUE) to tell apart features with 
the same name."
           },
           "id" : {
             "type" : "string",

Reply via email to