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

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

commit 06ce3f41a7892ba7a29c5d53371b435e5e9a407f
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Apr 10 19:04:24 2025 +0200

    CAMEL-21949: camel-core - Type converter with allowNull should be a valid 
response for ConvertBodyTo
---
 .../cxf/converter/CxfConverterLoader.java          | 48 +++++++++++++--
 .../cxf/converter/CxfPayloadConverterLoader.java   | 68 ++++++++++++++++++----
 .../cxf/converter/CxfPayloadConverter.java         |  4 +-
 .../component/cxf/jaxrs/CxfConverterLoader.java    | 58 +++++++++++++++---
 .../camel/component/cxf/jaxrs/CxfConverter.java    |  2 +-
 .../resources/velocity/type-converter-loader.vm    | 11 +++-
 6 files changed, 162 insertions(+), 29 deletions(-)

diff --git 
a/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfConverterLoader.java
 
b/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfConverterLoader.java
index 3a1356e3a66..c6bed12eb01 100644
--- 
a/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfConverterLoader.java
+++ 
b/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfConverterLoader.java
@@ -46,17 +46,53 @@ public final class CxfConverterLoader implements 
TypeConverterLoader, CamelConte
 
     private void registerConverters(TypeConverterRegistry registry) {
         addTypeConverter(registry, java.io.InputStream.class, 
jakarta.xml.soap.SOAPMessage.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.soapMessageToInputStream((jakarta.xml.soap.SOAPMessage)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.soapMessageToInputStream((jakarta.xml.soap.SOAPMessage)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, java.lang.Object[].class, 
java.lang.Object.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.toArray(value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.toArray(value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, java.lang.String.class, 
jakarta.xml.soap.SOAPMessage.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.soapMessageToString((jakarta.xml.soap.SOAPMessage)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.soapMessageToString((jakarta.xml.soap.SOAPMessage)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, javax.xml.namespace.QName.class, 
java.lang.String.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.toQName((java.lang.String)
 value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.toQName((java.lang.String)
 value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.DataFormat.class, java.lang.String.class, 
false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.toDataFormat((java.lang.String)
 value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.toDataFormat((java.lang.String)
 value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.cxf.message.MessageContentsList.class, java.lang.Object[].class, 
false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfConverter.toMessageContentsList((java.lang.Object[])
 value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfConverter.toMessageContentsList((java.lang.Object[])
 value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
     }
 
     private static void addTypeConverter(TypeConverterRegistry registry, 
Class<?> toType, Class<?> fromType, boolean allowNull, 
SimpleTypeConverter.ConversionMethod method) {
diff --git 
a/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfPayloadConverterLoader.java
 
b/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfPayloadConverterLoader.java
index 4c150d22bc1..c783284480c 100644
--- 
a/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfPayloadConverterLoader.java
+++ 
b/components/camel-cxf/camel-cxf-common/src/generated/java/org/apache/camel/component/cxf/converter/CxfPayloadConverterLoader.java
@@ -45,22 +45,70 @@ public final class CxfPayloadConverterLoader implements 
TypeConverterLoader, Cam
     }
 
     private void registerConverters(TypeConverterRegistry registry) {
-        addTypeConverter(registry, javax.xml.transform.Source.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToSource((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange));
+        addTypeConverter(registry, javax.xml.transform.Source.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, true,
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToSource((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange);
+                if (true && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, org.apache.camel.StreamCache.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToStreamCache((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToStreamCache((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.CxfPayload.class, 
javax.xml.transform.Source.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.sourceToCxfPayload((javax.xml.transform.Source)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.sourceToCxfPayload((javax.xml.transform.Source)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.CxfPayload.class, 
org.w3c.dom.Document.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.documentToCxfPayload((org.w3c.dom.Document)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.documentToCxfPayload((org.w3c.dom.Document)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.CxfPayload.class, 
org.w3c.dom.Element.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.elementToCxfPayload((org.w3c.dom.Element)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.elementToCxfPayload((org.w3c.dom.Element)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.CxfPayload.class, 
org.w3c.dom.NodeList.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.nodeListToCxfPayload((org.w3c.dom.NodeList)
 value, exchange));
-        addTypeConverter(registry, org.w3c.dom.Node.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToNode((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.nodeListToCxfPayload((org.w3c.dom.NodeList)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
+        addTypeConverter(registry, org.w3c.dom.Node.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, true,
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayLoadToNode((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange);
+                if (true && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, org.w3c.dom.NodeList.class, 
org.apache.camel.component.cxf.common.CxfPayload.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayloadToNodeList((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.converter.CxfPayloadConverter.cxfPayloadToNodeList((org.apache.camel.component.cxf.common.CxfPayload)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
     }
 
     private static void addTypeConverter(TypeConverterRegistry registry, 
Class<?> toType, Class<?> fromType, boolean allowNull, 
SimpleTypeConverter.ConversionMethod method) {
diff --git 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
index 9a09861f205..44a03d66ab7 100644
--- 
a/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
+++ 
b/components/camel-cxf/camel-cxf-common/src/main/java/org/apache/camel/component/cxf/converter/CxfPayloadConverter.java
@@ -93,7 +93,7 @@ public final class CxfPayloadConverter {
         return new NodeListWrapper(payload.getBody());
     }
 
-    @Converter
+    @Converter(allowNull = true)
     public static <T> Node cxfPayLoadToNode(CxfPayload<T> payload, Exchange 
exchange) {
         List<Element> payloadBodyElements = payload.getBody();
 
@@ -103,7 +103,7 @@ public final class CxfPayloadConverter {
         return null;
     }
 
-    @Converter
+    @Converter(allowNull = true)
     public static <T> Source cxfPayLoadToSource(CxfPayload<T> payload, 
Exchange exchange) {
         List<Source> payloadBody = payload.getBodySources();
 
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/generated/java/org/apache/camel/component/cxf/jaxrs/CxfConverterLoader.java
 
b/components/camel-cxf/camel-cxf-rest/src/generated/java/org/apache/camel/component/cxf/jaxrs/CxfConverterLoader.java
index 08c8c2e6205..698247d0117 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/generated/java/org/apache/camel/component/cxf/jaxrs/CxfConverterLoader.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/generated/java/org/apache/camel/component/cxf/jaxrs/CxfConverterLoader.java
@@ -45,20 +45,62 @@ public final class CxfConverterLoader implements 
TypeConverterLoader, CamelConte
     }
 
     private void registerConverters(TypeConverterRegistry registry) {
-        addTypeConverter(registry, java.io.InputStream.class, 
jakarta.ws.rs.core.Response.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toInputStream((jakarta.ws.rs.core.Response)
 value, exchange));
+        addTypeConverter(registry, java.io.InputStream.class, 
jakarta.ws.rs.core.Response.class, true,
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toInputStream((jakarta.ws.rs.core.Response)
 value, exchange);
+                if (true && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, java.io.InputStream.class, 
jakarta.xml.soap.SOAPMessage.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.soapMessageToInputStream((jakarta.xml.soap.SOAPMessage)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.soapMessageToInputStream((jakarta.xml.soap.SOAPMessage)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, java.lang.Object[].class, 
java.lang.Object.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toArray(value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toArray(value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, java.lang.String.class, 
jakarta.xml.soap.SOAPMessage.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.soapMessageToString((jakarta.xml.soap.SOAPMessage)
 value, exchange));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.soapMessageToString((jakarta.xml.soap.SOAPMessage)
 value, exchange);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, javax.xml.namespace.QName.class, 
java.lang.String.class, false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toQName((java.lang.String) 
value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toQName((java.lang.String) 
value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.camel.component.cxf.common.DataFormat.class, java.lang.String.class, 
false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toDataFormat((java.lang.String)
 value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toDataFormat((java.lang.String)
 value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         addTypeConverter(registry, 
org.apache.cxf.message.MessageContentsList.class, java.lang.Object[].class, 
false,
-            (type, exchange, value) -> 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toMessageContentsList((java.lang.Object[])
 value));
+            (type, exchange, value) -> {
+                Object answer = 
org.apache.camel.component.cxf.jaxrs.CxfConverter.toMessageContentsList((java.lang.Object[])
 value);
+                if (false && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
     }
 
     private static void addTypeConverter(TypeConverterRegistry registry, 
Class<?> toType, Class<?> fromType, boolean allowNull, 
SimpleTypeConverter.ConversionMethod method) {
diff --git 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
index 7f86e18a6e7..9e34680bc7e 100644
--- 
a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
+++ 
b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/CxfConverter.java
@@ -100,7 +100,7 @@ public final class CxfConverter {
         return DataFormat.valueOf(name.toUpperCase());
     }
 
-    @Converter
+    @Converter(allowNull = true)
     public static InputStream toInputStream(Response response, Exchange 
exchange) {
         Object obj = response.getEntity();
 
diff --git 
a/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/type-converter-loader.vm
 
b/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/type-converter-loader.vm
index db63573c444..2837ac6fa06 100644
--- 
a/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/type-converter-loader.vm
+++ 
b/tooling/maven/camel-package-maven-plugin/src/main/resources/velocity/type-converter-loader.vm
@@ -76,8 +76,15 @@ public final class ${className} implements 
TypeConverterLoader, CamelContextAwar
     private void registerConverters(TypeConverterRegistry registry) {
     #foreach ( $to in $converters.getConverters().entrySet() )
         #foreach ( $from in $to.getValue().entrySet() )
-        addTypeConverter(registry, ${to.getKey()}.class, 
${mojo.toString($from.getKey())}.class, ${mojo.isAllowNull($from.getValue())},
-            (type, exchange, value) -> ${mojo.toJava($from.getValue(), 
$converterClasses)});
+        #set ( $allowNull = ${mojo.isAllowNull($from.getValue())} )
+        addTypeConverter(registry, ${to.getKey()}.class, 
${mojo.toString($from.getKey())}.class, $allowNull,
+            (type, exchange, value) -> {
+                Object answer = ${mojo.toJava($from.getValue(), 
$converterClasses)};
+                if ($allowNull && answer == null) {
+                    answer = Void.class;
+                }
+                return answer;
+            });
         #end
     #end
     }

Reply via email to