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

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


The following commit(s) were added to refs/heads/camel-4.0.x by this push:
     new ab9dc5ee350 CAMEL-19821: camel-spring-rabbitmq - Option allowNullBody 
can now be set on endpoint level as well. (#11269)
ab9dc5ee350 is described below

commit ab9dc5ee3508a477c0b0f1f5bb43b6b032387338
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Sep 1 12:01:15 2023 +0200

    CAMEL-19821: camel-spring-rabbitmq - Option allowNullBody can now be set on 
endpoint level as well. (#11269)
---
 .../camel/catalog/components/spring-rabbitmq.json  | 19 ++++-----
 .../SpringRabbitMQEndpointConfigurer.java          |  6 +++
 .../SpringRabbitMQEndpointUriFactory.java          |  3 +-
 .../component/springrabbit/spring-rabbitmq.json    | 19 ++++-----
 .../AllowNullBodyMessageConverter.java             | 46 ++++++++++++++++++++++
 .../springrabbit/DefaultMessageConverter.java      | 14 ++-----
 .../springrabbit/SpringRabbitMQComponent.java      |  3 +-
 .../springrabbit/SpringRabbitMQEndpoint.java       | 19 +++++++++
 ...odyIT.java => RabbitMQComponentNullBodyIT.java} |  2 +-
 .../integration/RabbitMQProducerNullBodyIT.java    | 12 +-----
 .../dsl/SpringRabbitMQEndpointBuilderFactory.java  | 37 +++++++++++++++++
 11 files changed, 137 insertions(+), 43 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
index 655e6bf7384..b8924d69b99 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
@@ -103,14 +103,15 @@
     "messageListenerContainerType": { "index": 25, "kind": "parameter", 
"displayName": "Message Listener Container Type", "group": "consumer 
(advanced)", "label": "consumer,advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "DMLC", "SMLC" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": "DMLC", 
"description": "The type of the MessageListenerContainer" },
     "prefetchCount": { "index": 26, "kind": "parameter", "displayName": 
"Prefetch Count", "group": "consumer (advanced)", "label": "consumer,advanced", 
"required": false, "type": "integer", "javaType": "java.lang.Integer", 
"deprecated": false, "autowired": false, "secret": false, "description": "Tell 
the broker how many messages to send in a single request. Often this can be set 
quite high to improve throughput." },
     "retry": { "index": 27, "kind": "parameter", "displayName": "Retry", 
"group": "consumer (advanced)", "label": "consumer,advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.retry.interceptor.RetryOperationsInterceptor", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Custom retry configuration to use. If this is configured then the other 
settings such as maximumRetryAttempts for retry are not in use." },
-    "confirm": { "index": 28, "kind": "parameter", "displayName": "Confirm", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "auto", "enabled", "disabled" ], 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"auto", "description": "Controls whether to wait for confirms. The connection 
factory must be configured for publisher confirms and this method. auto = Camel 
detects if the connection fac [...]
-    "confirmTimeout": { "index": 29, "kind": "parameter", "displayName": 
"Confirm Timeout", "group": "producer", "label": "producer", "required": false, 
"type": "duration", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "5000", "description": "Specify the 
timeout in milliseconds to be used when waiting for a message sent to be 
confirmed by RabbitMQ when doing send only messaging (InOnly). The default 
value is 5 seconds. A negative value indi [...]
-    "replyTimeout": { "index": 30, "kind": "parameter", "displayName": "Reply 
Timeout", "group": "producer", "label": "producer", "required": false, "type": 
"duration", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "30000", "description": "Specify the timeout 
in milliseconds to be used when waiting for a reply message when doing 
request\/reply (InOut) messaging. The default value is 30 seconds. A negative 
value indicates an indefinite timeo [...]
-    "usePublisherConnection": { "index": 31, "kind": "parameter", 
"displayName": "Use Publisher Connection", "group": "producer", "label": 
"producer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Use a separate connection for publishers and consumers" 
},
-    "lazyStartProducer": { "index": 32, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
-    "args": { "index": 33, "kind": "parameter", "displayName": "Args", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": 
"arg.", "multiValue": true, "deprecated": false, "autowired": false, "secret": 
false, "description": "Specify arguments for configuring the different RabbitMQ 
concepts, a different prefix is required for each element: arg.consumer. 
arg.exchange. arg.queue. arg.bindin [...]
-    "messageConverter": { "index": 34, "kind": "parameter", "displayName": 
"Message Converter", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.amqp.support.converter.MessageConverter", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
MessageConverter so you can be in control how to map to\/from a 
org.springframework.amqp.core.Message." },
-    "messagePropertiesConverter": { "index": 35, "kind": "parameter", 
"displayName": "Message Properties Converter", "group": "advanced", "label": 
"advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.springrabbit.MessagePropertiesConverter", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom MessagePropertiesConverter so you can be in control how to map 
to\/from a org.springframework.amqp.core.MessageProperties." },
-    "synchronous": { "index": 36, "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" }
+    "allowNullBody": { "index": 28, "kind": "parameter", "displayName": "Allow 
Null Body", "group": "producer", "label": "producer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Whether to allow 
sending messages with no body. If this option is false and the message body is 
null, then an MessageConversionException is thrown." },
+    "confirm": { "index": 29, "kind": "parameter", "displayName": "Confirm", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "auto", "enabled", "disabled" ], 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"auto", "description": "Controls whether to wait for confirms. The connection 
factory must be configured for publisher confirms and this method. auto = Camel 
detects if the connection fac [...]
+    "confirmTimeout": { "index": 30, "kind": "parameter", "displayName": 
"Confirm Timeout", "group": "producer", "label": "producer", "required": false, 
"type": "duration", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "5000", "description": "Specify the 
timeout in milliseconds to be used when waiting for a message sent to be 
confirmed by RabbitMQ when doing send only messaging (InOnly). The default 
value is 5 seconds. A negative value indi [...]
+    "replyTimeout": { "index": 31, "kind": "parameter", "displayName": "Reply 
Timeout", "group": "producer", "label": "producer", "required": false, "type": 
"duration", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "30000", "description": "Specify the timeout 
in milliseconds to be used when waiting for a reply message when doing 
request\/reply (InOut) messaging. The default value is 30 seconds. A negative 
value indicates an indefinite timeo [...]
+    "usePublisherConnection": { "index": 32, "kind": "parameter", 
"displayName": "Use Publisher Connection", "group": "producer", "label": 
"producer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Use a separate connection for publishers and consumers" 
},
+    "lazyStartProducer": { "index": 33, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "args": { "index": 34, "kind": "parameter", "displayName": "Args", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": 
"arg.", "multiValue": true, "deprecated": false, "autowired": false, "secret": 
false, "description": "Specify arguments for configuring the different RabbitMQ 
concepts, a different prefix is required for each element: arg.consumer. 
arg.exchange. arg.queue. arg.bindin [...]
+    "messageConverter": { "index": 35, "kind": "parameter", "displayName": 
"Message Converter", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.amqp.support.converter.MessageConverter", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
MessageConverter so you can be in control how to map to\/from a 
org.springframework.amqp.core.Message." },
+    "messagePropertiesConverter": { "index": 36, "kind": "parameter", 
"displayName": "Message Properties Converter", "group": "advanced", "label": 
"advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.springrabbit.MessagePropertiesConverter", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom MessagePropertiesConverter so you can be in control how to map 
to\/from a org.springframework.amqp.core.MessageProperties." },
+    "synchronous": { "index": 37, "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" }
   }
 }
diff --git 
a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointConfigurer.java
 
b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointConfigurer.java
index 9b44a1eb362..f11d960a2d5 100644
--- 
a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointConfigurer.java
+++ 
b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointConfigurer.java
@@ -23,6 +23,8 @@ public class SpringRabbitMQEndpointConfigurer extends 
PropertyConfigurerSupport
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "acknowledgemode":
         case "acknowledgeMode": 
target.setAcknowledgeMode(property(camelContext, 
org.springframework.amqp.core.AcknowledgeMode.class, value)); return true;
+        case "allownullbody":
+        case "allowNullBody": target.setAllowNullBody(property(camelContext, 
boolean.class, value)); return true;
         case "args": target.setArgs(property(camelContext, 
java.util.Map.class, value)); return true;
         case "asyncconsumer":
         case "asyncConsumer": target.setAsyncConsumer(property(camelContext, 
boolean.class, value)); return true;
@@ -96,6 +98,8 @@ public class SpringRabbitMQEndpointConfigurer extends 
PropertyConfigurerSupport
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "acknowledgemode":
         case "acknowledgeMode": return 
org.springframework.amqp.core.AcknowledgeMode.class;
+        case "allownullbody":
+        case "allowNullBody": return boolean.class;
         case "args": return java.util.Map.class;
         case "asyncconsumer":
         case "asyncConsumer": return boolean.class;
@@ -170,6 +174,8 @@ public class SpringRabbitMQEndpointConfigurer extends 
PropertyConfigurerSupport
         switch (ignoreCase ? name.toLowerCase() : name) {
         case "acknowledgemode":
         case "acknowledgeMode": return target.getAcknowledgeMode();
+        case "allownullbody":
+        case "allowNullBody": return target.isAllowNullBody();
         case "args": return target.getArgs();
         case "asyncconsumer":
         case "asyncConsumer": return target.isAsyncConsumer();
diff --git 
a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointUriFactory.java
 
b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointUriFactory.java
index d3f7ebcade4..9e0bc71025f 100644
--- 
a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointUriFactory.java
+++ 
b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpointUriFactory.java
@@ -21,8 +21,9 @@ public class SpringRabbitMQEndpointUriFactory extends 
org.apache.camel.support.c
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(37);
+        Set<String> props = new HashSet<>(38);
         props.add("acknowledgeMode");
+        props.add("allowNullBody");
         props.add("args");
         props.add("asyncConsumer");
         props.add("autoDeclare");
diff --git 
a/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
 
b/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
index 655e6bf7384..b8924d69b99 100644
--- 
a/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
+++ 
b/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
@@ -103,14 +103,15 @@
     "messageListenerContainerType": { "index": 25, "kind": "parameter", 
"displayName": "Message Listener Container Type", "group": "consumer 
(advanced)", "label": "consumer,advanced", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "DMLC", "SMLC" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": "DMLC", 
"description": "The type of the MessageListenerContainer" },
     "prefetchCount": { "index": 26, "kind": "parameter", "displayName": 
"Prefetch Count", "group": "consumer (advanced)", "label": "consumer,advanced", 
"required": false, "type": "integer", "javaType": "java.lang.Integer", 
"deprecated": false, "autowired": false, "secret": false, "description": "Tell 
the broker how many messages to send in a single request. Often this can be set 
quite high to improve throughput." },
     "retry": { "index": 27, "kind": "parameter", "displayName": "Retry", 
"group": "consumer (advanced)", "label": "consumer,advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.retry.interceptor.RetryOperationsInterceptor", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Custom retry configuration to use. If this is configured then the other 
settings such as maximumRetryAttempts for retry are not in use." },
-    "confirm": { "index": 28, "kind": "parameter", "displayName": "Confirm", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "auto", "enabled", "disabled" ], 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"auto", "description": "Controls whether to wait for confirms. The connection 
factory must be configured for publisher confirms and this method. auto = Camel 
detects if the connection fac [...]
-    "confirmTimeout": { "index": 29, "kind": "parameter", "displayName": 
"Confirm Timeout", "group": "producer", "label": "producer", "required": false, 
"type": "duration", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "5000", "description": "Specify the 
timeout in milliseconds to be used when waiting for a message sent to be 
confirmed by RabbitMQ when doing send only messaging (InOnly). The default 
value is 5 seconds. A negative value indi [...]
-    "replyTimeout": { "index": 30, "kind": "parameter", "displayName": "Reply 
Timeout", "group": "producer", "label": "producer", "required": false, "type": 
"duration", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "30000", "description": "Specify the timeout 
in milliseconds to be used when waiting for a reply message when doing 
request\/reply (InOut) messaging. The default value is 30 seconds. A negative 
value indicates an indefinite timeo [...]
-    "usePublisherConnection": { "index": 31, "kind": "parameter", 
"displayName": "Use Publisher Connection", "group": "producer", "label": 
"producer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Use a separate connection for publishers and consumers" 
},
-    "lazyStartProducer": { "index": 32, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
-    "args": { "index": 33, "kind": "parameter", "displayName": "Args", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": 
"arg.", "multiValue": true, "deprecated": false, "autowired": false, "secret": 
false, "description": "Specify arguments for configuring the different RabbitMQ 
concepts, a different prefix is required for each element: arg.consumer. 
arg.exchange. arg.queue. arg.bindin [...]
-    "messageConverter": { "index": 34, "kind": "parameter", "displayName": 
"Message Converter", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.amqp.support.converter.MessageConverter", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
MessageConverter so you can be in control how to map to\/from a 
org.springframework.amqp.core.Message." },
-    "messagePropertiesConverter": { "index": 35, "kind": "parameter", 
"displayName": "Message Properties Converter", "group": "advanced", "label": 
"advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.springrabbit.MessagePropertiesConverter", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom MessagePropertiesConverter so you can be in control how to map 
to\/from a org.springframework.amqp.core.MessageProperties." },
-    "synchronous": { "index": 36, "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" }
+    "allowNullBody": { "index": 28, "kind": "parameter", "displayName": "Allow 
Null Body", "group": "producer", "label": "producer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Whether to allow 
sending messages with no body. If this option is false and the message body is 
null, then an MessageConversionException is thrown." },
+    "confirm": { "index": 29, "kind": "parameter", "displayName": "Confirm", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "enum": [ "auto", "enabled", "disabled" ], 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
"auto", "description": "Controls whether to wait for confirms. The connection 
factory must be configured for publisher confirms and this method. auto = Camel 
detects if the connection fac [...]
+    "confirmTimeout": { "index": 30, "kind": "parameter", "displayName": 
"Confirm Timeout", "group": "producer", "label": "producer", "required": false, 
"type": "duration", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": "5000", "description": "Specify the 
timeout in milliseconds to be used when waiting for a message sent to be 
confirmed by RabbitMQ when doing send only messaging (InOnly). The default 
value is 5 seconds. A negative value indi [...]
+    "replyTimeout": { "index": 31, "kind": "parameter", "displayName": "Reply 
Timeout", "group": "producer", "label": "producer", "required": false, "type": 
"duration", "javaType": "long", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "30000", "description": "Specify the timeout 
in milliseconds to be used when waiting for a reply message when doing 
request\/reply (InOut) messaging. The default value is 30 seconds. A negative 
value indicates an indefinite timeo [...]
+    "usePublisherConnection": { "index": 32, "kind": "parameter", 
"displayName": "Use Publisher Connection", "group": "producer", "label": 
"producer", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Use a separate connection for publishers and consumers" 
},
+    "lazyStartProducer": { "index": 33, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "args": { "index": 34, "kind": "parameter", "displayName": "Args", 
"group": "advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.Map<java.lang.String, java.lang.Object>", "prefix": 
"arg.", "multiValue": true, "deprecated": false, "autowired": false, "secret": 
false, "description": "Specify arguments for configuring the different RabbitMQ 
concepts, a different prefix is required for each element: arg.consumer. 
arg.exchange. arg.queue. arg.bindin [...]
+    "messageConverter": { "index": 35, "kind": "parameter", "displayName": 
"Message Converter", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.springframework.amqp.support.converter.MessageConverter", "deprecated": 
false, "autowired": false, "secret": false, "description": "To use a custom 
MessageConverter so you can be in control how to map to\/from a 
org.springframework.amqp.core.Message." },
+    "messagePropertiesConverter": { "index": 36, "kind": "parameter", 
"displayName": "Message Properties Converter", "group": "advanced", "label": 
"advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.component.springrabbit.MessagePropertiesConverter", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom MessagePropertiesConverter so you can be in control how to map 
to\/from a org.springframework.amqp.core.MessageProperties." },
+    "synchronous": { "index": 37, "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" }
   }
 }
diff --git 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/AllowNullBodyMessageConverter.java
 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/AllowNullBodyMessageConverter.java
new file mode 100644
index 00000000000..97aff33979b
--- /dev/null
+++ 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/AllowNullBodyMessageConverter.java
@@ -0,0 +1,46 @@
+/*
+ * 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.springrabbit;
+
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageProperties;
+import org.springframework.amqp.support.converter.MessageConversionException;
+import org.springframework.amqp.support.converter.MessageConverter;
+
+public class AllowNullBodyMessageConverter implements MessageConverter {
+
+    private final MessageConverter converter;
+
+    public AllowNullBodyMessageConverter(MessageConverter converter) {
+        this.converter = converter;
+    }
+
+    @Override
+    public Message toMessage(Object object, MessageProperties 
messageProperties) throws MessageConversionException {
+        if (object == null) {
+            // cannot use null so use an empty array
+            byte[] empty = new byte[0];
+            return new Message(empty, messageProperties);
+        }
+        return converter.toMessage(object, messageProperties);
+    }
+
+    @Override
+    public Object fromMessage(Message message) throws 
MessageConversionException {
+        return converter.fromMessage(message);
+    }
+}
diff --git 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/DefaultMessageConverter.java
 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/DefaultMessageConverter.java
index eb7e3bd3806..58fbc11caa9 100644
--- 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/DefaultMessageConverter.java
+++ 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/DefaultMessageConverter.java
@@ -31,24 +31,16 @@ public class DefaultMessageConverter extends 
AbstractMessageConverter implements
 
     private final String defaultCharset = Charset.defaultCharset().name();
     private final CamelContext camelContext;
-    private final boolean allowNullBody;
 
-    public DefaultMessageConverter(CamelContext camelContext, boolean 
allowNullBody) {
+    public DefaultMessageConverter(CamelContext camelContext) {
         this.camelContext = camelContext;
-        this.allowNullBody = allowNullBody;
     }
 
     @Override
     public Message createMessage(Object body, MessageProperties 
messageProperties) throws MessageConversionException {
         if (body == null) {
-            if (!allowNullBody) {
-                throw new MessageConversionException(
-                        "Cannot send message as message body is null, and 
option allowNullBody is false.");
-            } else {
-                // cannot use null so use an empty array
-                byte[] empty = new byte[0];
-                return new Message(empty, messageProperties);
-            }
+            throw new MessageConversionException(
+                    "Cannot send message as message body is null, and option 
allowNullBody is false.");
         }
 
         boolean text = body instanceof String;
diff --git 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
index 29c3bdd848f..6bcc3d57271 100644
--- 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
+++ 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
@@ -121,7 +121,7 @@ public class SpringRabbitMQComponent extends 
HeaderFilterStrategyComponent {
             setHeaderFilterStrategy(new SpringRabbitMQHeaderFilterStrategy());
         }
         if (messageConverter == null) {
-            messageConverter = new DefaultMessageConverter(getCamelContext(), 
allowNullBody);
+            messageConverter = new DefaultMessageConverter(getCamelContext());
         }
         if (messagePropertiesConverter == null) {
             messagePropertiesConverter = new 
DefaultMessagePropertiesConverter(getCamelContext(), getHeaderFilterStrategy());
@@ -150,6 +150,7 @@ public class SpringRabbitMQComponent extends 
HeaderFilterStrategyComponent {
         endpoint.setMaximumRetryAttempts(maximumRetryAttempts);
         endpoint.setRetryDelay(retryDelay);
         endpoint.setRejectAndDontRequeue(rejectAndDontRequeue);
+        endpoint.setAllowNullBody(allowNullBody);
 
         endpoint.setArgs(PropertiesHelper.extractProperties(parameters, 
ARG_PREFIX));
         setProperties(endpoint, parameters);
diff --git 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java
 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java
index ed5a028104d..3c4e91128cf 100644
--- 
a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java
+++ 
b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQEndpoint.java
@@ -161,6 +161,9 @@ public class SpringRabbitMQEndpoint extends DefaultEndpoint 
implements AsyncEndp
     @UriParam(label = "producer", defaultValue = "false",
               description = "Use a separate connection for publishers and 
consumers")
     private boolean usePublisherConnection;
+    @UriParam(label = "producer", defaultValue = "false",
+              description = "Whether to allow sending messages with no body. 
If this option is false and the message body is null, then an 
MessageConversionException is thrown.")
+    private boolean allowNullBody;
     @UriParam(defaultValue = "false", label = "advanced",
               description = "Sets whether synchronous processing should be 
strictly used")
     private boolean synchronous;
@@ -197,6 +200,14 @@ public class SpringRabbitMQEndpoint extends 
DefaultEndpoint implements AsyncEndp
         return (SpringRabbitMQComponent) super.getComponent();
     }
 
+    @Override
+    protected void doInit() throws Exception {
+        if (allowNullBody) {
+            // need to wrap message converter in allow null
+            messageConverter = new 
AllowNullBodyMessageConverter(messageConverter);
+        }
+    }
+
     public String getExchangeName() {
         return exchangeName;
     }
@@ -385,6 +396,14 @@ public class SpringRabbitMQEndpoint extends 
DefaultEndpoint implements AsyncEndp
         this.usePublisherConnection = usePublisherConnection;
     }
 
+    public boolean isAllowNullBody() {
+        return allowNullBody;
+    }
+
+    public void setAllowNullBody(boolean allowNullBody) {
+        this.allowNullBody = allowNullBody;
+    }
+
     public boolean isSynchronous() {
         return synchronous;
     }
diff --git 
a/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
 
b/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQComponentNullBodyIT.java
similarity index 97%
copy from 
components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
copy to 
components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQComponentNullBodyIT.java
index 6791dcfbfcd..e29557a4d40 100644
--- 
a/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
+++ 
b/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQComponentNullBodyIT.java
@@ -29,7 +29,7 @@ import org.springframework.amqp.core.TopicExchange;
 import org.springframework.amqp.rabbit.connection.ConnectionFactory;
 import org.springframework.amqp.rabbit.core.RabbitAdmin;
 
-public class RabbitMQProducerNullBodyIT extends RabbitMQITSupport {
+public class RabbitMQComponentNullBodyIT extends RabbitMQITSupport {
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
diff --git 
a/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
 
b/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
index 6791dcfbfcd..788d4dd34cf 100644
--- 
a/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
+++ 
b/components/camel-spring-rabbitmq/src/test/java/org/apache/camel/component/springrabbit/integration/RabbitMQProducerNullBodyIT.java
@@ -16,10 +16,8 @@
  */
 package org.apache.camel.component.springrabbit.integration;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.springrabbit.SpringRabbitMQComponent;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.springframework.amqp.core.AmqpAdmin;
@@ -31,14 +29,6 @@ import org.springframework.amqp.rabbit.core.RabbitAdmin;
 
 public class RabbitMQProducerNullBodyIT extends RabbitMQITSupport {
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext camelContext = super.createCamelContext();
-        SpringRabbitMQComponent rmq = 
camelContext.getComponent("spring-rabbitmq", SpringRabbitMQComponent.class);
-        rmq.setAllowNullBody(true);
-        return camelContext;
-    }
-
     @Test
     public void testProducer() {
         ConnectionFactory cf = 
context.getRegistry().lookupByNameAndType("myCF", ConnectionFactory.class);
@@ -60,7 +50,7 @@ public class RabbitMQProducerNullBodyIT extends 
RabbitMQITSupport {
             @Override
             public void configure() throws Exception {
                 from("direct:start")
-                        .to("spring-rabbitmq:foo?routingKey=foo.bar");
+                        
.to("spring-rabbitmq:foo?routingKey=foo.bar&allowNullBody=true");
             }
         };
     }
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringRabbitMQEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringRabbitMQEndpointBuilderFactory.java
index 2092dad9317..b173fb15193 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringRabbitMQEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/SpringRabbitMQEndpointBuilderFactory.java
@@ -1185,6 +1185,43 @@ public interface SpringRabbitMQEndpointBuilderFactory {
             doSetProperty("testConnectionOnStartup", testConnectionOnStartup);
             return this;
         }
+        /**
+         * Whether to allow sending messages with no body. If this option is
+         * false and the message body is null, then an
+         * MessageConversionException is thrown.
+         * 
+         * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param allowNullBody the value to set
+         * @return the dsl builder
+         */
+        default SpringRabbitMQEndpointProducerBuilder allowNullBody(
+                boolean allowNullBody) {
+            doSetProperty("allowNullBody", allowNullBody);
+            return this;
+        }
+        /**
+         * Whether to allow sending messages with no body. If this option is
+         * false and the message body is null, then an
+         * MessageConversionException is thrown.
+         * 
+         * The option will be converted to a &lt;code&gt;boolean&lt;/code&gt;
+         * type.
+         * 
+         * Default: false
+         * Group: producer
+         * 
+         * @param allowNullBody the value to set
+         * @return the dsl builder
+         */
+        default SpringRabbitMQEndpointProducerBuilder allowNullBody(
+                String allowNullBody) {
+            doSetProperty("allowNullBody", allowNullBody);
+            return this;
+        }
         /**
          * Controls whether to wait for confirms. The connection factory must 
be
          * configured for publisher confirms and this method. auto = Camel


Reply via email to