This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch camel-4.14.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.14.x by this push:
new 17f8fcb22569 CAMEL-23409: camel-sjms - Disable ObjectMessage by
default (#22970)
17f8fcb22569 is described below
commit 17f8fcb22569f4c459b9e53c1485bfc764dc0015
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed May 6 09:22:05 2026 +0200
CAMEL-23409: camel-sjms - Disable ObjectMessage by default (#22970)
For consistency with camel-jms (CAMEL-23373), disable creation and
reading of jakarta.jms.ObjectMessage by default in camel-sjms and
add a new objectMessageEnabled option (default false) on SjmsComponent
and SjmsEndpoint to opt back in. camel-sjms2 inherits the change via
Sjms2Endpoint extends SjmsEndpoint and Sjms2Component extends
SjmsComponent.
When disabled, JmsBinding refuses to:
- create an ObjectMessage from a Serializable body (auto-detected
jmsMessageType=Object or explicitly set)
- create an ObjectMessage for transferException
- extract the body of a received ObjectMessage
Both component- and endpoint-level options carry
security="insecure:serialization" so the Camel security policy sees
a uniform signal at both levels.
Tests: SjmsObjectMessageEnabledTest covers producer/consumer
default-disabled behavior, endpoint-level override, and
component-level override; JmsBindingObjectMessageEnabledTest
covers the transferException reply path. Documentation updated
in the 4.21 upgrade guide.
Closes #22945
Signed-off-by: Andrea Cosentino <[email protected]>
---
.../org/apache/camel/catalog/components/sjms.json | 22 ++--
.../org/apache/camel/catalog/components/sjms2.json | 22 ++--
.../component/sjms/SjmsComponentConfigurer.java | 6 +
.../component/sjms/SjmsEndpointConfigurer.java | 6 +
.../component/sjms/SjmsEndpointUriFactory.java | 3 +-
.../org/apache/camel/component/sjms/sjms.json | 22 ++--
.../apache/camel/component/sjms/SjmsComponent.java | 24 ++++
.../apache/camel/component/sjms/SjmsEndpoint.java | 25 +++-
.../camel/component/sjms/jms/JmsBinding.java | 36 ++++-
.../jms/JmsBindingObjectMessageEnabledTest.java | 47 +++++++
.../producer/SjmsObjectMessageEnabledTest.java | 145 +++++++++++++++++++++
.../component/sjms2/Sjms2EndpointUriFactory.java | 3 +-
.../org/apache/camel/component/sjms2/sjms2.json | 22 ++--
.../ROOT/pages/camel-4x-upgrade-guide-4_14.adoc | 28 ++++
.../dsl/Sjms2ComponentBuilderFactory.java | 25 ++++
.../component/dsl/SjmsComponentBuilderFactory.java | 25 ++++
.../endpoint/dsl/Sjms2EndpointBuilderFactory.java | 132 +++++++++++++++++++
.../endpoint/dsl/SjmsEndpointBuilderFactory.java | 132 +++++++++++++++++++
18 files changed, 681 insertions(+), 44 deletions(-)
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms.json
index bdc121af6194..58b7179c58d7 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms.json
@@ -33,11 +33,12 @@
"exceptionListener": { "index": 6, "kind": "property", "displayName":
"Exception Listener", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType": "jakarta.jms.ExceptionListener",
"deprecated": false, "autowired": false, "secret": false, "description":
"Specifies the JMS Exception Listener that is to be notified of any underlying
JMS exceptions." },
"jmsKeyFormatStrategy": { "index": 7, "kind": "property", "displayName":
"Jms Key Format Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "Pluggable strategy
for encoding and decoding JMS keys so they can be compliant with the JMS
specification. Camel provides one implementation out of the box: defaul [...]
"messageCreatedStrategy": { "index": 8, "kind": "property", "displayName":
"Message Created Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 9, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "replyToOnTimeoutMaxConcurrentConsumers": { "index": 10, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
- "requestTimeoutCheckerInterval": { "index": 11, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
- "headerFilterStrategy": { "index": 12, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
- "deserializationFilter": { "index": 13, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
+ "objectMessageEnabled": { "index": 9, "kind": "property", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option on [...]
+ "recoveryInterval": { "index": 10, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "replyToOnTimeoutMaxConcurrentConsumers": { "index": 11, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
+ "requestTimeoutCheckerInterval": { "index": 12, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
+ "headerFilterStrategy": { "index": 13, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
+ "deserializationFilter": { "index": 14, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
},
"headers": {
"CamelJMSDestinationName": { "index": 0, "kind": "header", "displayName":
"", "group": "producer", "label": "producer", "required": false, "javaType":
"String", "deprecated": false, "deprecationNote": "", "autowired": false,
"secret": false, "description": "DestinationName is a JMS queue or topic name.
By default, the destinationName is interpreted as a queue name.",
"constantName":
"org.apache.camel.component.sjms.SjmsConstants#JMS_DESTINATION_NAME" },
@@ -89,10 +90,11 @@
"jmsMessageType": { "index": 40, "kind": "parameter", "displayName": "Jms
Message Type", "group": "advanced", "label": "advanced", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.sjms.jms.JmsMessageType", "enum": [ "Bytes", "Map",
"Object", "Stream", "Text" ], "deprecated": false, "autowired": false,
"secret": false, "description": "Allows you to force the use of a specific
jakarta.jms.Message implementation for sending JMS messages. Possible values
are: By [...]
"mapJmsMessage": { "index": 41, "kind": "parameter", "displayName": "Map
Jms Message", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Specifies whether
Camel should auto map the received JMS message to a suited payload type, such
as jakarta.jms.TextMessage to a String etc. See section about how mapping works
below for more details." },
"messageCreatedStrategy": { "index": 42, "kind": "parameter",
"displayName": "Message Created Strategy", "group": "advanced", "label":
"advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 43, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "synchronous": { "index": 44, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
- "transferException": { "index": 45, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
- "deserializationFilter": { "index": 46, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
- "transacted": { "index": 47, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
+ "objectMessageEnabled": { "index": 43, "kind": "parameter", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option [...]
+ "recoveryInterval": { "index": 44, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "synchronous": { "index": 45, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
+ "transferException": { "index": 46, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
+ "deserializationFilter": { "index": 47, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
+ "transacted": { "index": 48, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
}
}
diff --git
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms2.json
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms2.json
index aabcd17e3a4c..aae0f5012bb0 100644
---
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms2.json
+++
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sjms2.json
@@ -33,11 +33,12 @@
"exceptionListener": { "index": 6, "kind": "property", "displayName":
"Exception Listener", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType": "jakarta.jms.ExceptionListener",
"deprecated": false, "autowired": false, "secret": false, "description":
"Specifies the JMS Exception Listener that is to be notified of any underlying
JMS exceptions." },
"jmsKeyFormatStrategy": { "index": 7, "kind": "property", "displayName":
"Jms Key Format Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "Pluggable strategy
for encoding and decoding JMS keys so they can be compliant with the JMS
specification. Camel provides one implementation out of the box: defaul [...]
"messageCreatedStrategy": { "index": 8, "kind": "property", "displayName":
"Message Created Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 9, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "replyToOnTimeoutMaxConcurrentConsumers": { "index": 10, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
- "requestTimeoutCheckerInterval": { "index": 11, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
- "headerFilterStrategy": { "index": 12, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
- "deserializationFilter": { "index": 13, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
+ "objectMessageEnabled": { "index": 9, "kind": "property", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option on [...]
+ "recoveryInterval": { "index": 10, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "replyToOnTimeoutMaxConcurrentConsumers": { "index": 11, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
+ "requestTimeoutCheckerInterval": { "index": 12, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
+ "headerFilterStrategy": { "index": 13, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
+ "deserializationFilter": { "index": 14, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
},
"headers": {
"CamelJMSDestinationName": { "index": 0, "kind": "header", "displayName":
"", "group": "producer", "label": "producer", "required": false, "javaType":
"String", "deprecated": false, "deprecationNote": "", "autowired": false,
"secret": false, "description": "DestinationName is a JMS queue or topic name.
By default, the destinationName is interpreted as a queue name.",
"constantName":
"org.apache.camel.component.sjms.SjmsConstants#JMS_DESTINATION_NAME" },
@@ -92,10 +93,11 @@
"jmsMessageType": { "index": 43, "kind": "parameter", "displayName": "Jms
Message Type", "group": "advanced", "label": "advanced", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.sjms.jms.JmsMessageType", "enum": [ "Bytes", "Map",
"Object", "Stream", "Text" ], "deprecated": false, "autowired": false,
"secret": false, "description": "Allows you to force the use of a specific
jakarta.jms.Message implementation for sending JMS messages. Possible values
are: By [...]
"mapJmsMessage": { "index": 44, "kind": "parameter", "displayName": "Map
Jms Message", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Specifies whether
Camel should auto map the received JMS message to a suited payload type, such
as jakarta.jms.TextMessage to a String etc. See section about how mapping works
below for more details." },
"messageCreatedStrategy": { "index": 45, "kind": "parameter",
"displayName": "Message Created Strategy", "group": "advanced", "label":
"advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 46, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "synchronous": { "index": 47, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
- "transferException": { "index": 48, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
- "deserializationFilter": { "index": 49, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
- "transacted": { "index": 50, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
+ "objectMessageEnabled": { "index": 46, "kind": "parameter", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option [...]
+ "recoveryInterval": { "index": 47, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "synchronous": { "index": 48, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
+ "transferException": { "index": 49, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
+ "deserializationFilter": { "index": 50, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
+ "transacted": { "index": 51, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
}
}
diff --git
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsComponentConfigurer.java
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsComponentConfigurer.java
index 4382bbe5613a..65891fb52154 100644
---
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsComponentConfigurer.java
+++
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsComponentConfigurer.java
@@ -45,6 +45,8 @@ public class SjmsComponentConfigurer extends
PropertyConfigurerSupport implement
case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
case "messagecreatedstrategy":
case "messageCreatedStrategy":
target.setMessageCreatedStrategy(property(camelContext,
org.apache.camel.component.sjms.jms.MessageCreatedStrategy.class, value));
return true;
+ case "objectmessageenabled":
+ case "objectMessageEnabled":
target.setObjectMessageEnabled(property(camelContext, boolean.class, value));
return true;
case "recoveryinterval":
case "recoveryInterval":
target.setRecoveryInterval(property(camelContext, java.time.Duration.class,
value).toMillis()); return true;
case "replytoontimeoutmaxconcurrentconsumers":
@@ -85,6 +87,8 @@ public class SjmsComponentConfigurer extends
PropertyConfigurerSupport implement
case "lazyStartProducer": return boolean.class;
case "messagecreatedstrategy":
case "messageCreatedStrategy": return
org.apache.camel.component.sjms.jms.MessageCreatedStrategy.class;
+ case "objectmessageenabled":
+ case "objectMessageEnabled": return boolean.class;
case "recoveryinterval":
case "recoveryInterval": return long.class;
case "replytoontimeoutmaxconcurrentconsumers":
@@ -121,6 +125,8 @@ public class SjmsComponentConfigurer extends
PropertyConfigurerSupport implement
case "lazyStartProducer": return target.isLazyStartProducer();
case "messagecreatedstrategy":
case "messageCreatedStrategy": return
target.getMessageCreatedStrategy();
+ case "objectmessageenabled":
+ case "objectMessageEnabled": return target.isObjectMessageEnabled();
case "recoveryinterval":
case "recoveryInterval": return target.getRecoveryInterval();
case "replytoontimeoutmaxconcurrentconsumers":
diff --git
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointConfigurer.java
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointConfigurer.java
index 00514c0ea497..dd1de9b416c4 100644
---
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointConfigurer.java
+++
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointConfigurer.java
@@ -85,6 +85,8 @@ public class SjmsEndpointConfigurer extends
PropertyConfigurerSupport implements
case "messageCreatedStrategy":
target.setMessageCreatedStrategy(property(camelContext,
org.apache.camel.component.sjms.jms.MessageCreatedStrategy.class, value));
return true;
case "messageselector":
case "messageSelector":
target.setMessageSelector(property(camelContext, java.lang.String.class,
value)); return true;
+ case "objectmessageenabled":
+ case "objectMessageEnabled":
target.setObjectMessageEnabled(property(camelContext, boolean.class, value));
return true;
case "preservemessageqos":
case "preserveMessageQos":
target.setPreserveMessageQos(property(camelContext, boolean.class, value));
return true;
case "priority": target.setPriority(property(camelContext, int.class,
value)); return true;
@@ -181,6 +183,8 @@ public class SjmsEndpointConfigurer extends
PropertyConfigurerSupport implements
case "messageCreatedStrategy": return
org.apache.camel.component.sjms.jms.MessageCreatedStrategy.class;
case "messageselector":
case "messageSelector": return java.lang.String.class;
+ case "objectmessageenabled":
+ case "objectMessageEnabled": return boolean.class;
case "preservemessageqos":
case "preserveMessageQos": return boolean.class;
case "priority": return int.class;
@@ -278,6 +282,8 @@ public class SjmsEndpointConfigurer extends
PropertyConfigurerSupport implements
case "messageCreatedStrategy": return
target.getMessageCreatedStrategy();
case "messageselector":
case "messageSelector": return target.getMessageSelector();
+ case "objectmessageenabled":
+ case "objectMessageEnabled": return target.isObjectMessageEnabled();
case "preservemessageqos":
case "preserveMessageQos": return target.isPreserveMessageQos();
case "priority": return target.getPriority();
diff --git
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointUriFactory.java
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointUriFactory.java
index b20530efffbd..11069013910b 100644
---
a/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointUriFactory.java
+++
b/components/camel-sjms/src/generated/java/org/apache/camel/component/sjms/SjmsEndpointUriFactory.java
@@ -23,7 +23,7 @@ public class SjmsEndpointUriFactory extends
org.apache.camel.support.component.E
private static final Set<String> SECRET_PROPERTY_NAMES;
private static final Set<String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(48);
+ Set<String> props = new HashSet<>(49);
props.add("acknowledgementMode");
props.add("allowNullBody");
props.add("asyncConsumer");
@@ -57,6 +57,7 @@ public class SjmsEndpointUriFactory extends
org.apache.camel.support.component.E
props.add("mapJmsMessage");
props.add("messageCreatedStrategy");
props.add("messageSelector");
+ props.add("objectMessageEnabled");
props.add("preserveMessageQos");
props.add("priority");
props.add("recoveryInterval");
diff --git
a/components/camel-sjms/src/generated/resources/META-INF/org/apache/camel/component/sjms/sjms.json
b/components/camel-sjms/src/generated/resources/META-INF/org/apache/camel/component/sjms/sjms.json
index bdc121af6194..58b7179c58d7 100644
---
a/components/camel-sjms/src/generated/resources/META-INF/org/apache/camel/component/sjms/sjms.json
+++
b/components/camel-sjms/src/generated/resources/META-INF/org/apache/camel/component/sjms/sjms.json
@@ -33,11 +33,12 @@
"exceptionListener": { "index": 6, "kind": "property", "displayName":
"Exception Listener", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType": "jakarta.jms.ExceptionListener",
"deprecated": false, "autowired": false, "secret": false, "description":
"Specifies the JMS Exception Listener that is to be notified of any underlying
JMS exceptions." },
"jmsKeyFormatStrategy": { "index": 7, "kind": "property", "displayName":
"Jms Key Format Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "Pluggable strategy
for encoding and decoding JMS keys so they can be compliant with the JMS
specification. Camel provides one implementation out of the box: defaul [...]
"messageCreatedStrategy": { "index": 8, "kind": "property", "displayName":
"Message Created Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 9, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "replyToOnTimeoutMaxConcurrentConsumers": { "index": 10, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
- "requestTimeoutCheckerInterval": { "index": 11, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
- "headerFilterStrategy": { "index": 12, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
- "deserializationFilter": { "index": 13, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
+ "objectMessageEnabled": { "index": 9, "kind": "property", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option on [...]
+ "recoveryInterval": { "index": 10, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "replyToOnTimeoutMaxConcurrentConsumers": { "index": 11, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
+ "requestTimeoutCheckerInterval": { "index": 12, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
+ "headerFilterStrategy": { "index": 13, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
+ "deserializationFilter": { "index": 14, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
},
"headers": {
"CamelJMSDestinationName": { "index": 0, "kind": "header", "displayName":
"", "group": "producer", "label": "producer", "required": false, "javaType":
"String", "deprecated": false, "deprecationNote": "", "autowired": false,
"secret": false, "description": "DestinationName is a JMS queue or topic name.
By default, the destinationName is interpreted as a queue name.",
"constantName":
"org.apache.camel.component.sjms.SjmsConstants#JMS_DESTINATION_NAME" },
@@ -89,10 +90,11 @@
"jmsMessageType": { "index": 40, "kind": "parameter", "displayName": "Jms
Message Type", "group": "advanced", "label": "advanced", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.sjms.jms.JmsMessageType", "enum": [ "Bytes", "Map",
"Object", "Stream", "Text" ], "deprecated": false, "autowired": false,
"secret": false, "description": "Allows you to force the use of a specific
jakarta.jms.Message implementation for sending JMS messages. Possible values
are: By [...]
"mapJmsMessage": { "index": 41, "kind": "parameter", "displayName": "Map
Jms Message", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Specifies whether
Camel should auto map the received JMS message to a suited payload type, such
as jakarta.jms.TextMessage to a String etc. See section about how mapping works
below for more details." },
"messageCreatedStrategy": { "index": 42, "kind": "parameter",
"displayName": "Message Created Strategy", "group": "advanced", "label":
"advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 43, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "synchronous": { "index": 44, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
- "transferException": { "index": 45, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
- "deserializationFilter": { "index": 46, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
- "transacted": { "index": 47, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
+ "objectMessageEnabled": { "index": 43, "kind": "parameter", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option [...]
+ "recoveryInterval": { "index": 44, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "synchronous": { "index": 45, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
+ "transferException": { "index": 46, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
+ "deserializationFilter": { "index": 47, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
+ "transacted": { "index": 48, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
}
}
diff --git
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsComponent.java
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsComponent.java
index 7a515a37ddd1..331dafeec7e8 100644
---
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsComponent.java
+++
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsComponent.java
@@ -84,6 +84,14 @@ public class SjmsComponent extends
HeaderFilterStrategyComponent {
+ " a conservative default filter denying
java.net.** and otherwise allowing java.**, javax.**"
+ " and org.apache.camel.** is applied.")
private String deserializationFilter;
+ @Metadata(label = "advanced",
+ description = "Whether to enable sending and receiving JMS
ObjectMessage."
+ + " By default this is disabled because Java
object serialization is a known source of security"
+ + " vulnerabilities. Enable this option only if
you trust the source of the messages and need"
+ + " to send or receive Java serialized objects via
JMS. When disabled, Camel will refuse to"
+ + " create or read JMS ObjectMessage instances.
Options that rely on ObjectMessage internally"
+ + " (such as transferException) require this
option to be enabled.")
+ private boolean objectMessageEnabled;
public SjmsComponent() {
}
@@ -103,6 +111,7 @@ public class SjmsComponent extends
HeaderFilterStrategyComponent {
endpoint.setClientId(clientId);
endpoint.setExceptionListener(exceptionListener);
endpoint.setDeserializationFilter(deserializationFilter);
+ endpoint.setObjectMessageEnabled(objectMessageEnabled);
if (getHeaderFilterStrategy() != null) {
endpoint.setHeaderFilterStrategy(getHeaderFilterStrategy());
}
@@ -238,4 +247,19 @@ public class SjmsComponent extends
HeaderFilterStrategyComponent {
public void setDeserializationFilter(String deserializationFilter) {
this.deserializationFilter = deserializationFilter;
}
+
+ public boolean isObjectMessageEnabled() {
+ return objectMessageEnabled;
+ }
+
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By default
this is disabled because Java object
+ * serialization is a known source of security vulnerabilities. Enable
this option only if you trust the source of
+ * the messages and need to send or receive Java serialized objects via
JMS. When disabled, Camel will refuse to
+ * create or read JMS ObjectMessage instances. Options that rely on
ObjectMessage internally (such as
+ * transferException) require this option to be enabled.
+ */
+ public void setObjectMessageEnabled(boolean objectMessageEnabled) {
+ this.objectMessageEnabled = objectMessageEnabled;
+ }
}
diff --git
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
index e37d84968f19..5bfb3190f098 100644
---
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
+++
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
@@ -219,6 +219,14 @@ public class SjmsEndpoint extends DefaultEndpoint
+ " a conservative default filter denying
java.net.** and otherwise allowing java.**, javax.**"
+ " and org.apache.camel.** is applied.")
private String deserializationFilter;
+ @UriParam(label = "advanced",
+ description = "Whether to enable sending and receiving JMS
ObjectMessage."
+ + " By default this is disabled because Java
object serialization is a known source of security"
+ + " vulnerabilities. Enable this option only if
you trust the source of the messages and need"
+ + " to send or receive Java serialized objects via
JMS. When disabled, Camel will refuse to"
+ + " create or read JMS ObjectMessage instances.
Options that rely on ObjectMessage internally"
+ + " (such as transferException) require this
option to be enabled.")
+ private boolean objectMessageEnabled;
@UriParam(label = "advanced", enums = "Bytes,Map,Object,Stream,Text",
description = "Allows you to force the use of a specific
jakarta.jms.Message implementation for sending JMS messages."
+ " Possible values are: Bytes, Map, Object,
Stream, Text."
@@ -474,7 +482,7 @@ public class SjmsEndpoint extends DefaultEndpoint
protected JmsBinding createBinding() {
return new JmsBinding(
isMapJmsMessage(), isAllowNullBody(),
getHeaderFilterStrategy(), getJmsKeyFormatStrategy(),
- getMessageCreatedStrategy(), getJmsMessageType(),
getDeserializationFilter());
+ getMessageCreatedStrategy(), getJmsMessageType(),
getDeserializationFilter(), isObjectMessageEnabled());
}
public void setBinding(JmsBinding binding) {
@@ -776,6 +784,21 @@ public class SjmsEndpoint extends DefaultEndpoint
this.deserializationFilter = deserializationFilter;
}
+ public boolean isObjectMessageEnabled() {
+ return objectMessageEnabled;
+ }
+
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By default
this is disabled because Java object
+ * serialization is a known source of security vulnerabilities. Enable
this option only if you trust the source of
+ * the messages and need to send or receive Java serialized objects via
JMS. When disabled, Camel will refuse to
+ * create or read JMS ObjectMessage instances. Options that rely on
ObjectMessage internally (such as
+ * transferException) require this option to be enabled.
+ */
+ public void setObjectMessageEnabled(boolean objectMessageEnabled) {
+ this.objectMessageEnabled = objectMessageEnabled;
+ }
+
public MessageCreatedStrategy getMessageCreatedStrategy() {
return messageCreatedStrategy;
}
diff --git
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
index 9760f2d7c1bd..7313160cda30 100644
---
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
+++
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsBinding.java
@@ -82,18 +82,27 @@ public class JmsBinding {
private final MessageCreatedStrategy messageCreatedStrategy;
private final JmsMessageType jmsMessageType;
private final ObjectInputFilter deserializationFilter;
+ private final boolean objectMessageEnabled;
public JmsBinding(boolean mapJmsMessage, boolean allowNullBody,
HeaderFilterStrategy headerFilterStrategy,
JmsKeyFormatStrategy jmsJmsKeyFormatStrategy,
MessageCreatedStrategy messageCreatedStrategy,
JmsMessageType jmsMessageType) {
this(mapJmsMessage, allowNullBody, headerFilterStrategy,
jmsJmsKeyFormatStrategy,
- messageCreatedStrategy, jmsMessageType, null);
+ messageCreatedStrategy, jmsMessageType, null, false);
}
public JmsBinding(boolean mapJmsMessage, boolean allowNullBody,
HeaderFilterStrategy headerFilterStrategy,
JmsKeyFormatStrategy jmsJmsKeyFormatStrategy,
MessageCreatedStrategy messageCreatedStrategy,
JmsMessageType jmsMessageType,
String deserializationFilterPattern) {
+ this(mapJmsMessage, allowNullBody, headerFilterStrategy,
jmsJmsKeyFormatStrategy,
+ messageCreatedStrategy, jmsMessageType,
deserializationFilterPattern, false);
+ }
+
+ public JmsBinding(boolean mapJmsMessage, boolean allowNullBody,
+ HeaderFilterStrategy headerFilterStrategy,
JmsKeyFormatStrategy jmsJmsKeyFormatStrategy,
+ MessageCreatedStrategy messageCreatedStrategy,
JmsMessageType jmsMessageType,
+ String deserializationFilterPattern, boolean
objectMessageEnabled) {
this.mapJmsMessage = mapJmsMessage;
this.allowNullBody = allowNullBody;
this.headerFilterStrategy = headerFilterStrategy;
@@ -101,6 +110,22 @@ public class JmsBinding {
this.messageCreatedStrategy = messageCreatedStrategy;
this.jmsMessageType = jmsMessageType;
this.deserializationFilter =
resolveDeserializationFilter(deserializationFilterPattern);
+ this.objectMessageEnabled = objectMessageEnabled;
+ }
+
+ /**
+ * Whether sending and receiving JMS {@link ObjectMessage} is enabled.
Disabled by default for security reasons.
+ * When disabled, the binding refuses to create or read JMS {@link
ObjectMessage} instances, and any feature that
+ * relies on {@link ObjectMessage} (such as {@code transferException}) is
also disabled.
+ */
+ protected boolean isObjectMessageEnabled() {
+ return objectMessageEnabled;
+ }
+
+ private static IllegalStateException objectMessageDisabled(String
operation) {
+ return new IllegalStateException(
+ "JMS ObjectMessage is disabled by default for security reasons
(" + operation + ")."
+ + " Set objectMessageEnabled=true on
the SJMS endpoint or component to enable it.");
}
private static ObjectInputFilter resolveDeserializationFilter(String
configuredPattern) {
@@ -188,6 +213,9 @@ public class JmsBinding {
}
if (message instanceof ObjectMessage) {
+ if (!isObjectMessageEnabled()) {
+ throw objectMessageDisabled("receiving ObjectMessage");
+ }
LOG.trace("Extracting body as a ObjectMessage from JMS
message: {}", message);
ObjectMessage objectMessage = (ObjectMessage) message;
Object payload = objectMessage.getObject();
@@ -454,6 +482,9 @@ public class JmsBinding {
}
protected Message createJmsMessage(Exception cause, Session session)
throws JMSException {
+ if (!isObjectMessageEnabled()) {
+ throw objectMessageDisabled("transferException reply");
+ }
LOG.trace("Using JmsMessageType: {}", JmsMessageType.Object);
Message answer = session.createObjectMessage(cause);
// ensure default delivery mode is used by default
@@ -566,6 +597,9 @@ public class JmsBinding {
return message;
}
case Object:
+ if (!isObjectMessageEnabled()) {
+ throw objectMessageDisabled("creating ObjectMessage");
+ }
ObjectMessage message = session.createObjectMessage();
if (body != null) {
try {
diff --git
a/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingObjectMessageEnabledTest.java
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingObjectMessageEnabledTest.java
new file mode 100644
index 000000000000..088903296d05
--- /dev/null
+++
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/jms/JmsBindingObjectMessageEnabledTest.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.sjms.jms;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Unit-style tests for the {@code objectMessageEnabled} guards on {@link
JmsBinding}. Complements the broker-based
+ * {@code SjmsObjectMessageEnabledTest} by verifying each guard in isolation,
including the {@code transferException}
+ * reply path which is otherwise difficult to assert end-to-end (a broken
reply path manifests as a producer-side
+ * timeout, hiding the underlying guard message).
+ */
+public class JmsBindingObjectMessageEnabledTest {
+
+ private JmsBinding binding(boolean objectMessageEnabled) {
+ return new JmsBinding(true, true, null, null, null, null, null,
objectMessageEnabled);
+ }
+
+ @Test
+ public void testTransferExceptionReplyRefusedByDefault() {
+ // Direct invocation of the public makeJmsMessage(Exception, ...)
path. The guard fires before the Session is
+ // touched, so passing null is safe and isolates the assertion.
+ IllegalStateException ex = assertThrows(IllegalStateException.class,
+ () -> binding(false).makeJmsMessage(null, null, null, new
RuntimeException("boom")));
+ assertTrue(ex.getMessage().contains("transferException reply"),
+ "Expected transferException-specific operation in error
message, got: " + ex.getMessage());
+ assertTrue(ex.getMessage().contains("objectMessageEnabled=true"),
+ "Expected guidance to enable objectMessageEnabled=true, got: "
+ ex.getMessage());
+ }
+}
diff --git
a/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/producer/SjmsObjectMessageEnabledTest.java
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/producer/SjmsObjectMessageEnabledTest.java
new file mode 100644
index 000000000000..2c26c4eb0dca
--- /dev/null
+++
b/components/camel-sjms/src/test/java/org/apache/camel/component/sjms/producer/SjmsObjectMessageEnabledTest.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.sjms.producer;
+
+import jakarta.jms.Message;
+import jakarta.jms.MessageConsumer;
+import jakarta.jms.MessageProducer;
+import jakarta.jms.ObjectMessage;
+
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.sjms.SjmsComponent;
+import org.apache.camel.component.sjms.support.JmsTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * Verifies that JMS ObjectMessage support is disabled by default in
camel-sjms and can be enabled via the
+ * {@code objectMessageEnabled} option.
+ */
+public class SjmsObjectMessageEnabledTest extends JmsTestSupport {
+
+ private static final String DISABLED_QUEUE =
"test.SjmsObjectMessageEnabledTest.disabled";
+ private static final String ENABLED_QUEUE =
"test.SjmsObjectMessageEnabledTest.enabled";
+ private static final String CONSUMER_QUEUE =
"test.SjmsObjectMessageEnabledTest.consumer";
+
+ @Override
+ protected boolean useJmx() {
+ return false;
+ }
+
+ @Test
+ public void testProducerRefusesSerializableBodyByDefault() {
+ CamelExecutionException ex =
assertThrows(CamelExecutionException.class,
+ () -> template.sendBody("sjms:queue:" + DISABLED_QUEUE +
"?jmsMessageType=Object",
+ new MyOrder("beer", 10)));
+ Throwable cause = rootCause(ex);
+ assertTrue(cause.getMessage().contains("objectMessageEnabled=true"),
+ "Expected guidance to enable objectMessageEnabled=true, got: "
+ cause.getMessage());
+ }
+
+ @Test
+ public void testProducerAcceptsSerializableBodyWhenEnabled() throws
Exception {
+ // when objectMessageEnabled=true, sending a Serializable body via
Object message type should succeed
+ template.sendBody("sjms:queue:" + ENABLED_QUEUE +
"?jmsMessageType=Object&objectMessageEnabled=true",
+ new MyOrder("beer", 10));
+ // verify it was actually sent as an ObjectMessage
+ MessageConsumer mc = createQueueConsumer(ENABLED_QUEUE);
+ Message message = mc.receive(5000);
+ assertNotNull(message, "Should have received the message");
+ assertTrue(message instanceof ObjectMessage, "Expected ObjectMessage
but got: " + message.getClass().getName());
+ mc.close();
+ }
+
+ @Test
+ public void testConsumerRefusesObjectMessageByDefault() throws Exception {
+ // Send an ObjectMessage directly to the queue (bypassing Camel) using
the underlying JMS session
+ MessageProducer producer =
getSession().createProducer(getSession().createQueue(CONSUMER_QUEUE));
+ ObjectMessage objectMessage = getSession().createObjectMessage();
+ objectMessage.setObject(new MyOrder("beer", 5));
+ producer.send(objectMessage);
+ producer.close();
+
+ // Reading the body via Camel should fail because
objectMessageEnabled=false (default)
+ Exchange exchange = consumer.receive("sjms:queue:" + CONSUMER_QUEUE,
5000);
+ assertNotNull(exchange, "Should have received the exchange wrapper");
+ IllegalStateException ex = assertThrows(IllegalStateException.class,
+ () -> exchange.getIn().getBody());
+ assertTrue(ex.getMessage().contains("objectMessageEnabled=true"),
+ "Expected guidance to enable objectMessageEnabled=true, got: "
+ ex.getMessage());
+ }
+
+ @Test
+ public void testComponentLevelObjectMessageEnabled() throws Exception {
+ SjmsComponent custom = new SjmsComponent();
+ custom.setConnectionFactory(connectionFactory);
+ custom.setObjectMessageEnabled(true);
+ context.addComponent("sjmsObjectEnabled", custom);
+
+ String queue = "test.SjmsObjectMessageEnabledTest.componentLevel";
+ template.sendBody("sjmsObjectEnabled:queue:" + queue +
"?jmsMessageType=Object",
+ new MyOrder("beer", 7));
+ MessageConsumer mc = createQueueConsumer(queue);
+ Message message = mc.receive(5000);
+ assertNotNull(message, "Should have received the message");
+ assertTrue(message instanceof ObjectMessage, "Expected ObjectMessage
but got: " + message.getClass().getName());
+ mc.close();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ // No routes: this test uses the producer template and the consumer
template directly
+ return new RouteBuilder() {
+ @Override
+ public void configure() {
+ // intentionally empty
+ }
+ };
+ }
+
+ private static Throwable rootCause(Throwable t) {
+ Throwable cause = t;
+ while (cause.getCause() != null && cause.getCause() != cause) {
+ cause = cause.getCause();
+ }
+ return cause;
+ }
+
+ public static class MyOrder implements java.io.Serializable {
+ private static final long serialVersionUID = 1L;
+ private final String item;
+ private final int quantity;
+
+ public MyOrder(String item, int quantity) {
+ this.item = item;
+ this.quantity = quantity;
+ }
+
+ public String getItem() {
+ return item;
+ }
+
+ public int getQuantity() {
+ return quantity;
+ }
+ }
+}
diff --git
a/components/camel-sjms2/src/generated/java/org/apache/camel/component/sjms2/Sjms2EndpointUriFactory.java
b/components/camel-sjms2/src/generated/java/org/apache/camel/component/sjms2/Sjms2EndpointUriFactory.java
index 64a52097b2c7..9c7b57f80b76 100644
---
a/components/camel-sjms2/src/generated/java/org/apache/camel/component/sjms2/Sjms2EndpointUriFactory.java
+++
b/components/camel-sjms2/src/generated/java/org/apache/camel/component/sjms2/Sjms2EndpointUriFactory.java
@@ -23,7 +23,7 @@ public class Sjms2EndpointUriFactory extends
org.apache.camel.support.component.
private static final Set<String> SECRET_PROPERTY_NAMES;
private static final Set<String> MULTI_VALUE_PREFIXES;
static {
- Set<String> props = new HashSet<>(51);
+ Set<String> props = new HashSet<>(52);
props.add("acknowledgementMode");
props.add("allowNullBody");
props.add("asyncConsumer");
@@ -58,6 +58,7 @@ public class Sjms2EndpointUriFactory extends
org.apache.camel.support.component.
props.add("mapJmsMessage");
props.add("messageCreatedStrategy");
props.add("messageSelector");
+ props.add("objectMessageEnabled");
props.add("preserveMessageQos");
props.add("priority");
props.add("recoveryInterval");
diff --git
a/components/camel-sjms2/src/generated/resources/META-INF/org/apache/camel/component/sjms2/sjms2.json
b/components/camel-sjms2/src/generated/resources/META-INF/org/apache/camel/component/sjms2/sjms2.json
index aabcd17e3a4c..aae0f5012bb0 100644
---
a/components/camel-sjms2/src/generated/resources/META-INF/org/apache/camel/component/sjms2/sjms2.json
+++
b/components/camel-sjms2/src/generated/resources/META-INF/org/apache/camel/component/sjms2/sjms2.json
@@ -33,11 +33,12 @@
"exceptionListener": { "index": 6, "kind": "property", "displayName":
"Exception Listener", "group": "advanced", "label": "advanced", "required":
false, "type": "object", "javaType": "jakarta.jms.ExceptionListener",
"deprecated": false, "autowired": false, "secret": false, "description":
"Specifies the JMS Exception Listener that is to be notified of any underlying
JMS exceptions." },
"jmsKeyFormatStrategy": { "index": 7, "kind": "property", "displayName":
"Jms Key Format Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "Pluggable strategy
for encoding and decoding JMS keys so they can be compliant with the JMS
specification. Camel provides one implementation out of the box: defaul [...]
"messageCreatedStrategy": { "index": 8, "kind": "property", "displayName":
"Message Created Strategy", "group": "advanced", "label": "advanced",
"required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 9, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "replyToOnTimeoutMaxConcurrentConsumers": { "index": 10, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
- "requestTimeoutCheckerInterval": { "index": 11, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
- "headerFilterStrategy": { "index": 12, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
- "deserializationFilter": { "index": 13, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
+ "objectMessageEnabled": { "index": 9, "kind": "property", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option on [...]
+ "recoveryInterval": { "index": 10, "kind": "property", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "replyToOnTimeoutMaxConcurrentConsumers": { "index": 11, "kind":
"property", "displayName": "Reply To On Timeout Max Concurrent Consumers",
"group": "advanced", "label": "advanced", "required": false, "type": "integer",
"javaType": "int", "deprecated": false, "autowired": false, "secret": false,
"defaultValue": 1, "description": "Specifies the maximum number of concurrent
consumers for continue routing when timeout occurred when using request\/reply
over JMS." },
+ "requestTimeoutCheckerInterval": { "index": 12, "kind": "property",
"displayName": "Request Timeout Checker Interval", "group": "advanced",
"label": "advanced", "required": false, "type": "duration", "javaType": "long",
"deprecated": false, "autowired": false, "secret": false, "defaultValue":
"1000", "description": "Configures how often Camel should check for timed out
Exchanges when doing request\/reply over JMS. By default Camel checks once per
second. But if you must react faster [...]
+ "headerFilterStrategy": { "index": 13, "kind": "property", "displayName":
"Header Filter Strategy", "group": "filter", "label": "filter", "required":
false, "type": "object", "javaType":
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired":
false, "secret": false, "description": "To use a custom
org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel
message." },
+ "deserializationFilter": { "index": 14, "kind": "property", "displayName":
"Deserialization Filter", "group": "security", "label": "advanced,security",
"required": false, "type": "string", "javaType": "java.lang.String",
"deprecated": false, "autowired": false, "secret": false, "description": "Sets
an ObjectInputFilter pattern (jdk.serialFilter syntax) applied as a
defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalua [...]
},
"headers": {
"CamelJMSDestinationName": { "index": 0, "kind": "header", "displayName":
"", "group": "producer", "label": "producer", "required": false, "javaType":
"String", "deprecated": false, "deprecationNote": "", "autowired": false,
"secret": false, "description": "DestinationName is a JMS queue or topic name.
By default, the destinationName is interpreted as a queue name.",
"constantName":
"org.apache.camel.component.sjms.SjmsConstants#JMS_DESTINATION_NAME" },
@@ -92,10 +93,11 @@
"jmsMessageType": { "index": 43, "kind": "parameter", "displayName": "Jms
Message Type", "group": "advanced", "label": "advanced", "required": false,
"type": "enum", "javaType":
"org.apache.camel.component.sjms.jms.JmsMessageType", "enum": [ "Bytes", "Map",
"Object", "Stream", "Text" ], "deprecated": false, "autowired": false,
"secret": false, "description": "Allows you to force the use of a specific
jakarta.jms.Message implementation for sending JMS messages. Possible values
are: By [...]
"mapJmsMessage": { "index": 44, "kind": "parameter", "displayName": "Map
Jms Message", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": true, "description": "Specifies whether
Camel should auto map the received JMS message to a suited payload type, such
as jakarta.jms.TextMessage to a String etc. See section about how mapping works
below for more details." },
"messageCreatedStrategy": { "index": 45, "kind": "parameter",
"displayName": "Message Created Strategy", "group": "advanced", "label":
"advanced", "required": false, "type": "object", "javaType":
"org.apache.camel.component.sjms.jms.MessageCreatedStrategy", "deprecated":
false, "autowired": false, "secret": false, "description": "To use the given
MessageCreatedStrategy which are invoked when Camel creates new instances of
jakarta.jms.Message objects when Camel is sending a JMS message." },
- "recoveryInterval": { "index": 46, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
- "synchronous": { "index": 47, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
- "transferException": { "index": 48, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
- "deserializationFilter": { "index": 49, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
- "transacted": { "index": 50, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
+ "objectMessageEnabled": { "index": 46, "kind": "parameter", "displayName":
"Object Message Enabled", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Whether to enable sending and receiving JMS ObjectMessage. By default this is
disabled because Java object serialization is a known source of security
vulnerabilities. Enable this option [...]
+ "recoveryInterval": { "index": 47, "kind": "parameter", "displayName":
"Recovery Interval", "group": "advanced", "label": "advanced", "required":
false, "type": "duration", "javaType": "long", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "5000", "description":
"Specifies the interval between recovery attempts, i.e. when a connection is
being refreshed, in milliseconds. The default is 5000 ms, that is, 5 seconds."
},
+ "synchronous": { "index": 48, "kind": "parameter", "displayName":
"Synchronous", "group": "advanced", "label": "advanced", "required": false,
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired":
false, "secret": false, "defaultValue": false, "description": "Sets whether
synchronous processing should be strictly used" },
+ "transferException": { "index": 49, "kind": "parameter", "displayName":
"Transfer Exception", "group": "advanced", "label": "advanced", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description": "If
enabled and you are using Request Reply messaging (InOut) and an Exchange
failed on the consumer side, then the caused Exception will be send back in
response as a jakarta.jms.ObjectMessage. [...]
+ "deserializationFilter": { "index": 50, "kind": "parameter",
"displayName": "Deserialization Filter", "group": "security", "label":
"advanced,security", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Sets an ObjectInputFilter pattern (jdk.serialFilter syntax)
applied as a defense-in-depth check on the class of the body returned by
jakarta.jms.ObjectMessage.getObject(). The pattern is evalu [...]
+ "transacted": { "index": 51, "kind": "parameter", "displayName":
"Transacted", "group": "transaction", "label": "transaction", "required":
false, "type": "boolean", "javaType": "boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": false, "description":
"Specifies whether to use transacted mode" }
}
}
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc
index 574f3535b023..1cba1991bdb8 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_14.adoc
@@ -34,6 +34,34 @@ Or, on a single endpoint:
jms:queue:foo?objectMessageEnabled=true
----
+=== camel-sjms / camel-sjms2
+
+The same default applies to `camel-sjms` (and `camel-sjms2`, which inherits
from it): JMS `ObjectMessage`
+support is now disabled by default and gated by a new `objectMessageEnabled`
option (default `false`)
+on `SjmsComponent` / `SjmsEndpoint`.
+
+This affects the same endpoint/component options as `camel-jms`:
+
+* `jmsMessageType=Object` (or sending a `Serializable` body that is
auto-detected as `Object`)
+* `transferException=true`
+* receiving a JMS `ObjectMessage` produced by an external sender
+
+To restore the previous behavior, enable the option at the component or
endpoint level:
+
+[source,properties]
+----
+camel.component.sjms.objectMessageEnabled=true
+camel.component.sjms2.objectMessageEnabled=true
+----
+
+Or, on a single endpoint:
+
+[source,text]
+----
+sjms:queue:foo?objectMessageEnabled=true
+sjms2:queue:foo?objectMessageEnabled=true
+----
+
=== camel-hazelcast
Hazelcast instances created and managed by Camel (when no user-supplied
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Sjms2ComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Sjms2ComponentBuilderFactory.java
index ab910f1d4e52..c80d38fb1b84 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Sjms2ComponentBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Sjms2ComponentBuilderFactory.java
@@ -238,6 +238,30 @@ public interface Sjms2ComponentBuilderFactory {
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default Sjms2ComponentBuilder objectMessageEnabled(boolean
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+
+
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -361,6 +385,7 @@ public interface Sjms2ComponentBuilderFactory {
case "exceptionListener": ((Sjms2Component)
component).setExceptionListener((jakarta.jms.ExceptionListener) value); return
true;
case "jmsKeyFormatStrategy": ((Sjms2Component)
component).setJmsKeyFormatStrategy((org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy)
value); return true;
case "messageCreatedStrategy": ((Sjms2Component)
component).setMessageCreatedStrategy((org.apache.camel.component.sjms.jms.MessageCreatedStrategy)
value); return true;
+ case "objectMessageEnabled": ((Sjms2Component)
component).setObjectMessageEnabled((boolean) value); return true;
case "recoveryInterval": ((Sjms2Component)
component).setRecoveryInterval((long) value); return true;
case "replyToOnTimeoutMaxConcurrentConsumers": ((Sjms2Component)
component).setReplyToOnTimeoutMaxConcurrentConsumers((int) value); return true;
case "requestTimeoutCheckerInterval": ((Sjms2Component)
component).setRequestTimeoutCheckerInterval((long) value); return true;
diff --git
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SjmsComponentBuilderFactory.java
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SjmsComponentBuilderFactory.java
index b95272b6202d..e4557b669388 100644
---
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SjmsComponentBuilderFactory.java
+++
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SjmsComponentBuilderFactory.java
@@ -238,6 +238,30 @@ public interface SjmsComponentBuilderFactory {
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default SjmsComponentBuilder objectMessageEnabled(boolean
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+
+
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -361,6 +385,7 @@ public interface SjmsComponentBuilderFactory {
case "exceptionListener": ((SjmsComponent)
component).setExceptionListener((jakarta.jms.ExceptionListener) value); return
true;
case "jmsKeyFormatStrategy": ((SjmsComponent)
component).setJmsKeyFormatStrategy((org.apache.camel.component.sjms.jms.JmsKeyFormatStrategy)
value); return true;
case "messageCreatedStrategy": ((SjmsComponent)
component).setMessageCreatedStrategy((org.apache.camel.component.sjms.jms.MessageCreatedStrategy)
value); return true;
+ case "objectMessageEnabled": ((SjmsComponent)
component).setObjectMessageEnabled((boolean) value); return true;
case "recoveryInterval": ((SjmsComponent)
component).setRecoveryInterval((long) value); return true;
case "replyToOnTimeoutMaxConcurrentConsumers": ((SjmsComponent)
component).setReplyToOnTimeoutMaxConcurrentConsumers((int) value); return true;
case "requestTimeoutCheckerInterval": ((SjmsComponent)
component).setRequestTimeoutCheckerInterval((long) value); return true;
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Sjms2EndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Sjms2EndpointBuilderFactory.java
index fc74efe43723..23626f8b133e 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Sjms2EndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/Sjms2EndpointBuilderFactory.java
@@ -1091,6 +1091,50 @@ public interface Sjms2EndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointConsumerBuilder
objectMessageEnabled(boolean objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointConsumerBuilder
objectMessageEnabled(String objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -2281,6 +2325,50 @@ public interface Sjms2EndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointProducerBuilder
objectMessageEnabled(boolean objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointProducerBuilder
objectMessageEnabled(String objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -3006,6 +3094,50 @@ public interface Sjms2EndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointBuilder objectMessageEnabled(boolean
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjms2EndpointBuilder objectMessageEnabled(String
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
diff --git
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SjmsEndpointBuilderFactory.java
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SjmsEndpointBuilderFactory.java
index 5742c64fc03a..89d06f0069b4 100644
---
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SjmsEndpointBuilderFactory.java
+++
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SjmsEndpointBuilderFactory.java
@@ -1016,6 +1016,50 @@ public interface SjmsEndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointConsumerBuilder
objectMessageEnabled(boolean objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointConsumerBuilder
objectMessageEnabled(String objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -2206,6 +2250,50 @@ public interface SjmsEndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointProducerBuilder
objectMessageEnabled(boolean objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointProducerBuilder
objectMessageEnabled(String objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000
@@ -2931,6 +3019,50 @@ public interface SjmsEndpointBuilderFactory {
doSetProperty("messageCreatedStrategy", messageCreatedStrategy);
return this;
}
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option is a: <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointBuilder objectMessageEnabled(boolean
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
+ /**
+ * Whether to enable sending and receiving JMS ObjectMessage. By
default
+ * this is disabled because Java object serialization is a known source
+ * of security vulnerabilities. Enable this option only if you trust
the
+ * source of the messages and need to send or receive Java serialized
+ * objects via JMS. When disabled, Camel will refuse to create or read
+ * JMS ObjectMessage instances. Options that rely on ObjectMessage
+ * internally (such as transferException) require this option to be
+ * enabled.
+ *
+ * The option will be converted to a <code>boolean</code> type.
+ *
+ * Default: false
+ * Group: advanced
+ *
+ * @param objectMessageEnabled the value to set
+ * @return the dsl builder
+ */
+ default AdvancedSjmsEndpointBuilder objectMessageEnabled(String
objectMessageEnabled) {
+ doSetProperty("objectMessageEnabled", objectMessageEnabled);
+ return this;
+ }
/**
* Specifies the interval between recovery attempts, i.e. when a
* connection is being refreshed, in milliseconds. The default is 5000