You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2025/04/10 18:40:31 UTC

(camel) 03/04: CAMEL-21949: camel-core - Type converter with allowNull should be a valid response for ConvertBodyTo

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 <cl...@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
     }