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

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


The following commit(s) were added to refs/heads/main by this push:
     new 7991e21  fix(platform-http): conversion fallback to InputStream (#6059)
7991e21 is described below

commit 7991e21dddba07b3dd51b5b45efc8921097d5a8d
Author: Pasquale Congiusti <pasquale.congiu...@gmail.com>
AuthorDate: Thu Sep 9 08:58:39 2021 +0200

    fix(platform-http): conversion fallback to InputStream (#6059)
    
    * fix(platform-http): conversion fallback to InputStream
    
    We are trying to convert to ByteBuffer if available, otherwise falling back 
to most generic InputStream
    
    Closes CAMEL-16906
    
    * fix(dataformat/jackson): add conversion to InputStream
    
    Ref CAMEL-16906
    
    * fix(dataformat/fastjson): add conversion to InputStream
    
    Ref CAMEL-16906
    
    * fix(dataformat/gson): add conversion to InputStream
    
    Ref CAMEL-16906
    
    * fix(dataformat/johnzon): add conversion to InputStream
    
    Ref CAMEL-16906
    
    * fix(dataformat/jsonb): add conversion to InputStream
    
    Ref CAMEL-16906
    
    * Fix: autogen and checkstyle
---
 .../converter/FastJsonTypeConvertersLoader.java    |  59 ++++++++
 .../services/org/apache/camel/TypeConverterLoader  |   2 +
 .../fastjson/converter/FastJsonTypeConverters.java |  52 +++++++
 .../converter/FastJsonConversionsTest.java}        |  39 +++--
 .../gson/converter/GsonTypeConvertersLoader.java   |  59 ++++++++
 .../services/org/apache/camel/TypeConverterLoader  |   2 +
 .../gson/converter/GsonTypeConverters.java         |  56 ++++++++
 .../gson/conversion/GsonConversionsTest.java}      |  39 +++--
 .../jackson/converter/JacksonTypeConverters.java   |   7 +-
 ...st.java => JacksonConversionsAdvancedTest.java} |  28 +++-
 .../converter/JohnzonTypeConvertersLoader.java     |  59 ++++++++
 .../services/org/apache/camel/TypeConverterLoader  |   2 +
 .../johnzon/converter/JohnzonTypeConverters.java   |  58 ++++++++
 .../johnzon/converter/JohnzonConversionsTest.java} |  39 +++--
 .../jsonb/converter/JsonbTypeConvertersLoader.java |  59 ++++++++
 .../services/org/apache/camel/TypeConverterLoader  |   2 +
 .../jsonb/converter/JsonbTypeConverters.java       |  58 ++++++++
 .../jsonb/converter/JsonbConversionsTest.java}     |  39 +++--
 .../http/vertx/VertxPlatformHttpSupport.java       |  39 +++--
 .../http/vertx/VertxPlatformHttpEngineTest.java    |   4 +-
 ...rtxPlatformHttpEngineWithTypeConverterTest.java | 158 +++++++++++++++++++++
 21 files changed, 778 insertions(+), 82 deletions(-)

diff --git 
a/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java
 
b/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java
new file mode 100644
index 0000000..3a10e11
--- /dev/null
+++ 
b/components/camel-fastjson/src/generated/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConvertersLoader.java
@@ -0,0 +1,59 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.fastjson.converter;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class FastJsonTypeConvertersLoader implements 
TypeConverterLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public FastJsonTypeConvertersLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerFallbackConverters(registry);
+    }
+
+    private void registerFallbackConverters(TypeConverterRegistry registry) {
+        addFallbackTypeConverter(registry, false, false, (type, exchange, 
value) -> getFastJsonTypeConverters().convertTo(type, exchange, value, 
registry));
+    }
+
+    private static void addFallbackTypeConverter(TypeConverterRegistry 
registry, boolean allowNull, boolean canPromote, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, 
method), canPromote);
+    }
+
+    private volatile 
org.apache.camel.component.fastjson.converter.FastJsonTypeConverters 
fastJsonTypeConverters;
+    private 
org.apache.camel.component.fastjson.converter.FastJsonTypeConverters 
getFastJsonTypeConverters() {
+        if (fastJsonTypeConverters == null) {
+            fastJsonTypeConverters = new 
org.apache.camel.component.fastjson.converter.FastJsonTypeConverters();
+            CamelContextAware.trySetCamelContext(fastJsonTypeConverters, 
camelContext);
+        }
+        return fastJsonTypeConverters;
+    }
+}
diff --git 
a/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..a9e2fb7
--- /dev/null
+++ 
b/components/camel-fastjson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.fastjson.converter.FastJsonTypeConvertersLoader
diff --git 
a/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java
 
b/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java
new file mode 100644
index 0000000..4120927
--- /dev/null
+++ 
b/components/camel-fastjson/src/main/java/org/apache/camel/component/fastjson/converter/FastJsonTypeConverters.java
@@ -0,0 +1,52 @@
+/*
+ * 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.fastjson.converter;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+import com.alibaba.fastjson.JSON;
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+/**
+ * FastJson {@link org.apache.camel.TypeConverter} that allows converting json 
to byte buffer/stream oriented output.
+ * <br/>
+ * This implementation uses a fallback converter.
+ */
+@Converter(generateLoader = true)
+public final class FastJsonTypeConverters {
+
+    public FastJsonTypeConverters() {
+    }
+
+    @Converter(fallback = true)
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) throws Exception {
+        if (ByteBuffer.class.isAssignableFrom(type)) {
+            byte[] out = JSON.toJSONBytes(value);
+            return type.cast(ByteBuffer.wrap(out));
+        } else if (InputStream.class.isAssignableFrom(type)) {
+            byte[] out = JSON.toJSONBytes(value);
+            return type.cast(new ByteArrayInputStream(out));
+        }
+
+        return null;
+    }
+
+}
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
 
b/components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java
similarity index 63%
copy from 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
copy to 
components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java
index e91f69c..51e1728 100644
--- 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
+++ 
b/components/camel-fastjson/src/test/java/org/apache/camel/component/fastjson/converter/FastJsonConversionsTest.java
@@ -14,49 +14,58 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.jackson.converter;
+package org.apache.camel.component.fastjson.converter;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.jackson.JacksonConstants;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class JacksonConversionsBufferTest extends CamelTestSupport {
+public class FastJsonConversionsTest extends CamelTestSupport {
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        // enable jackson type converter by setting this property on
-        // CamelContext
-        context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, 
"true");
-        return context;
+    @Test
+    public void shouldConvertMapToByteBuffer() {
+        String name = "someName";
+        Map<String, String> pojoAsMap = new HashMap<>();
+        pojoAsMap.put("name", name);
+        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:bytebuffer", pojoAsMap);
+
+        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
     }
 
     @Test
-    public void shouldConvertMapToByteBuffer() {
+    public void shouldConvertMapToInputStream() {
         String name = "someName";
         Map<String, String> pojoAsMap = new HashMap<>();
         pojoAsMap.put("name", name);
+        InputStream testInputStream = (InputStream) 
template.requestBody("direct:inputstream", pojoAsMap);
 
-        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:test", pojoAsMap);
+        String text = new BufferedReader(
+                new InputStreamReader(testInputStream, StandardCharsets.UTF_8))
+                        .lines()
+                        .collect(Collectors.joining("\n"));
 
-        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
+        assertEquals("{\"name\":\"someName\"}", text);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
+
             @Override
             public void configure() throws Exception {
-                from("direct:test").convertBodyTo(ByteBuffer.class);
+                from("direct:bytebuffer").convertBodyTo(ByteBuffer.class);
+                from("direct:inputstream").convertBodyTo(InputStream.class);
             }
         };
     }
diff --git 
a/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java
 
b/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java
new file mode 100644
index 0000000..c1ef0d9
--- /dev/null
+++ 
b/components/camel-gson/src/generated/java/org/apache/camel/component/gson/converter/GsonTypeConvertersLoader.java
@@ -0,0 +1,59 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.gson.converter;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class GsonTypeConvertersLoader implements TypeConverterLoader, 
CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public GsonTypeConvertersLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerFallbackConverters(registry);
+    }
+
+    private void registerFallbackConverters(TypeConverterRegistry registry) {
+        addFallbackTypeConverter(registry, false, false, (type, exchange, 
value) -> getGsonTypeConverters().convertTo(type, exchange, value, registry));
+    }
+
+    private static void addFallbackTypeConverter(TypeConverterRegistry 
registry, boolean allowNull, boolean canPromote, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, 
method), canPromote);
+    }
+
+    private volatile 
org.apache.camel.component.gson.converter.GsonTypeConverters gsonTypeConverters;
+    private org.apache.camel.component.gson.converter.GsonTypeConverters 
getGsonTypeConverters() {
+        if (gsonTypeConverters == null) {
+            gsonTypeConverters = new 
org.apache.camel.component.gson.converter.GsonTypeConverters();
+            CamelContextAware.trySetCamelContext(gsonTypeConverters, 
camelContext);
+        }
+        return gsonTypeConverters;
+    }
+}
diff --git 
a/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..832e16f
--- /dev/null
+++ 
b/components/camel-gson/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.gson.converter.GsonTypeConvertersLoader
diff --git 
a/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java
 
b/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java
new file mode 100644
index 0000000..34d1f5d
--- /dev/null
+++ 
b/components/camel-gson/src/main/java/org/apache/camel/component/gson/converter/GsonTypeConverters.java
@@ -0,0 +1,56 @@
+/*
+ * 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.gson.converter;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+import com.google.gson.Gson;
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+/**
+ * GSon {@link org.apache.camel.TypeConverter} that allows converting json to 
byte buffer/stream oriented output. <br/>
+ * This implementation uses a fallback converter.
+ */
+@Converter(generateLoader = true)
+public final class GsonTypeConverters {
+
+    private final Gson gson;
+
+    public GsonTypeConverters() {
+        // Default configuration should be okey for conversion purposes
+        this.gson = new Gson();
+    }
+
+    @Converter(fallback = true)
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) throws Exception {
+        if (ByteBuffer.class.isAssignableFrom(type)) {
+            byte[] out = gson.toJson(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(ByteBuffer.wrap(out));
+        } else if (InputStream.class.isAssignableFrom(type)) {
+            byte[] out = gson.toJson(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(new ByteArrayInputStream(out));
+        }
+
+        return null;
+    }
+
+}
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
 
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java
similarity index 63%
copy from 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
copy to 
components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java
index e91f69c..bed3008 100644
--- 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
+++ 
b/components/camel-gson/src/test/java/org/apache/camel/component/gson/conversion/GsonConversionsTest.java
@@ -14,49 +14,58 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.jackson.converter;
+package org.apache.camel.component.gson.conversion;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.jackson.JacksonConstants;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class JacksonConversionsBufferTest extends CamelTestSupport {
+public class GsonConversionsTest extends CamelTestSupport {
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        // enable jackson type converter by setting this property on
-        // CamelContext
-        context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, 
"true");
-        return context;
+    @Test
+    public void shouldConvertMapToByteBuffer() {
+        String name = "someName";
+        Map<String, String> pojoAsMap = new HashMap<>();
+        pojoAsMap.put("name", name);
+        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:bytebuffer", pojoAsMap);
+
+        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
     }
 
     @Test
-    public void shouldConvertMapToByteBuffer() {
+    public void shouldConvertMapToInputStream() {
         String name = "someName";
         Map<String, String> pojoAsMap = new HashMap<>();
         pojoAsMap.put("name", name);
+        InputStream testInputStream = (InputStream) 
template.requestBody("direct:inputstream", pojoAsMap);
 
-        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:test", pojoAsMap);
+        String text = new BufferedReader(
+                new InputStreamReader(testInputStream, StandardCharsets.UTF_8))
+                        .lines()
+                        .collect(Collectors.joining("\n"));
 
-        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
+        assertEquals("{\"name\":\"someName\"}", text);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
+
             @Override
             public void configure() throws Exception {
-                from("direct:test").convertBodyTo(ByteBuffer.class);
+                from("direct:bytebuffer").convertBodyTo(ByteBuffer.class);
+                from("direct:inputstream").convertBodyTo(InputStream.class);
             }
         };
     }
diff --git 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
index 0751d2c..e63e357 100644
--- 
a/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
+++ 
b/components/camel-jackson/src/main/java/org/apache/camel/component/jackson/converter/JacksonTypeConverters.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.jackson.converter;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.InputStream;
 import java.io.Reader;
@@ -100,8 +101,7 @@ public final class JacksonTypeConverters {
             // favor use write/read operations as they are higher level than 
the
             // convertValue
 
-            // if we want to convert to a String or byte[] then use write
-            // operation
+            // if we want to convert to a String, byte[] or byte buffer/stream
             if (String.class.isAssignableFrom(type)) {
                 String out = mapper.writeValueAsString(value);
                 return type.cast(out);
@@ -111,6 +111,9 @@ public final class JacksonTypeConverters {
             } else if (ByteBuffer.class.isAssignableFrom(type)) {
                 byte[] out = mapper.writeValueAsBytes(value);
                 return type.cast(ByteBuffer.wrap(out));
+            } else if (InputStream.class.isAssignableFrom(type)) {
+                byte[] out = mapper.writeValueAsBytes(value);
+                return type.cast(new ByteArrayInputStream(out));
             } else if (mapper.canSerialize(type) && 
!Enum.class.isAssignableFrom(type)) {
                 // if the source value type is readable by the mapper then use
                 // its read operation
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
 
b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java
similarity index 69%
copy from 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
copy to 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java
index e91f69c..5ca2e76 100644
--- 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
+++ 
b/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsAdvancedTest.java
@@ -16,10 +16,14 @@
  */
 package org.apache.camel.component.jackson.converter;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
@@ -29,7 +33,7 @@ import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class JacksonConversionsBufferTest extends CamelTestSupport {
+public class JacksonConversionsAdvancedTest extends CamelTestSupport {
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
@@ -45,18 +49,34 @@ public class JacksonConversionsBufferTest extends 
CamelTestSupport {
         String name = "someName";
         Map<String, String> pojoAsMap = new HashMap<>();
         pojoAsMap.put("name", name);
-
-        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:test", pojoAsMap);
+        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:bytebuffer", pojoAsMap);
 
         assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
     }
 
+    @Test
+    public void shouldConvertMapToInputStream() {
+        String name = "someName";
+        Map<String, String> pojoAsMap = new HashMap<>();
+        pojoAsMap.put("name", name);
+        InputStream testInputStream = (InputStream) 
template.requestBody("direct:inputstream", pojoAsMap);
+
+        String text = new BufferedReader(
+                new InputStreamReader(testInputStream, StandardCharsets.UTF_8))
+                        .lines()
+                        .collect(Collectors.joining("\n"));
+
+        assertEquals("{\"name\":\"someName\"}", text);
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
+
             @Override
             public void configure() throws Exception {
-                from("direct:test").convertBodyTo(ByteBuffer.class);
+                from("direct:bytebuffer").convertBodyTo(ByteBuffer.class);
+                from("direct:inputstream").convertBodyTo(InputStream.class);
             }
         };
     }
diff --git 
a/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java
 
b/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java
new file mode 100644
index 0000000..eda9b14
--- /dev/null
+++ 
b/components/camel-johnzon/src/generated/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConvertersLoader.java
@@ -0,0 +1,59 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.johnzon.converter;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class JohnzonTypeConvertersLoader implements TypeConverterLoader, 
CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public JohnzonTypeConvertersLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerFallbackConverters(registry);
+    }
+
+    private void registerFallbackConverters(TypeConverterRegistry registry) {
+        addFallbackTypeConverter(registry, false, false, (type, exchange, 
value) -> getJohnzonTypeConverters().convertTo(type, exchange, value, 
registry));
+    }
+
+    private static void addFallbackTypeConverter(TypeConverterRegistry 
registry, boolean allowNull, boolean canPromote, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, 
method), canPromote);
+    }
+
+    private volatile 
org.apache.camel.component.johnzon.converter.JohnzonTypeConverters 
johnzonTypeConverters;
+    private org.apache.camel.component.johnzon.converter.JohnzonTypeConverters 
getJohnzonTypeConverters() {
+        if (johnzonTypeConverters == null) {
+            johnzonTypeConverters = new 
org.apache.camel.component.johnzon.converter.JohnzonTypeConverters();
+            CamelContextAware.trySetCamelContext(johnzonTypeConverters, 
camelContext);
+        }
+        return johnzonTypeConverters;
+    }
+}
diff --git 
a/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..c857d4a
--- /dev/null
+++ 
b/components/camel-johnzon/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.johnzon.converter.JohnzonTypeConvertersLoader
diff --git 
a/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java
 
b/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java
new file mode 100644
index 0000000..70a26e1
--- /dev/null
+++ 
b/components/camel-johnzon/src/main/java/org/apache/camel/component/johnzon/converter/JohnzonTypeConverters.java
@@ -0,0 +1,58 @@
+/*
+ * 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.johnzon.converter;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.johnzon.mapper.Mapper;
+import org.apache.johnzon.mapper.MapperBuilder;
+
+/**
+ * Johnzon {@link org.apache.camel.TypeConverter} that allows converting json 
to byte buffer/stream oriented output.
+ * <br/>
+ * This implementation uses a fallback converter.
+ */
+@Converter(generateLoader = true)
+public final class JohnzonTypeConverters {
+
+    private final Mapper objectMapper;
+
+    public JohnzonTypeConverters() {
+        // Default configuration should be okey for conversion purpose
+        this.objectMapper = new MapperBuilder().build();
+    }
+
+    @Converter(fallback = true)
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) throws Exception {
+        if (ByteBuffer.class.isAssignableFrom(type)) {
+            byte[] out = 
objectMapper.writeObjectAsString(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(ByteBuffer.wrap(out));
+        } else if (InputStream.class.isAssignableFrom(type)) {
+            byte[] out = 
objectMapper.writeObjectAsString(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(new ByteArrayInputStream(out));
+        }
+
+        return null;
+    }
+
+}
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
 
b/components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java
similarity index 63%
copy from 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
copy to 
components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java
index e91f69c..3d37dbe 100644
--- 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
+++ 
b/components/camel-johnzon/src/test/java/org/apache/camel/component/johnzon/converter/JohnzonConversionsTest.java
@@ -14,49 +14,58 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.jackson.converter;
+package org.apache.camel.component.johnzon.converter;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.jackson.JacksonConstants;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class JacksonConversionsBufferTest extends CamelTestSupport {
+public class JohnzonConversionsTest extends CamelTestSupport {
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        // enable jackson type converter by setting this property on
-        // CamelContext
-        context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, 
"true");
-        return context;
+    @Test
+    public void shouldConvertMapToByteBuffer() {
+        String name = "someName";
+        Map<String, String> pojoAsMap = new HashMap<>();
+        pojoAsMap.put("name", name);
+        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:bytebuffer", pojoAsMap);
+
+        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
     }
 
     @Test
-    public void shouldConvertMapToByteBuffer() {
+    public void shouldConvertMapToInputStream() {
         String name = "someName";
         Map<String, String> pojoAsMap = new HashMap<>();
         pojoAsMap.put("name", name);
+        InputStream testInputStream = (InputStream) 
template.requestBody("direct:inputstream", pojoAsMap);
 
-        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:test", pojoAsMap);
+        String text = new BufferedReader(
+                new InputStreamReader(testInputStream, StandardCharsets.UTF_8))
+                        .lines()
+                        .collect(Collectors.joining("\n"));
 
-        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
+        assertEquals("{\"name\":\"someName\"}", text);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
+
             @Override
             public void configure() throws Exception {
-                from("direct:test").convertBodyTo(ByteBuffer.class);
+                from("direct:bytebuffer").convertBodyTo(ByteBuffer.class);
+                from("direct:inputstream").convertBodyTo(InputStream.class);
             }
         };
     }
diff --git 
a/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java
 
b/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java
new file mode 100644
index 0000000..556fe8b
--- /dev/null
+++ 
b/components/camel-jsonb/src/generated/java/org/apache/camel/component/jsonb/converter/JsonbTypeConvertersLoader.java
@@ -0,0 +1,59 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.jsonb.converter;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class JsonbTypeConvertersLoader implements TypeConverterLoader, 
CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public JsonbTypeConvertersLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerFallbackConverters(registry);
+    }
+
+    private void registerFallbackConverters(TypeConverterRegistry registry) {
+        addFallbackTypeConverter(registry, false, false, (type, exchange, 
value) -> getJsonbTypeConverters().convertTo(type, exchange, value, registry));
+    }
+
+    private static void addFallbackTypeConverter(TypeConverterRegistry 
registry, boolean allowNull, boolean canPromote, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addFallbackTypeConverter(new SimpleTypeConverter(allowNull, 
method), canPromote);
+    }
+
+    private volatile 
org.apache.camel.component.jsonb.converter.JsonbTypeConverters 
jsonbTypeConverters;
+    private org.apache.camel.component.jsonb.converter.JsonbTypeConverters 
getJsonbTypeConverters() {
+        if (jsonbTypeConverters == null) {
+            jsonbTypeConverters = new 
org.apache.camel.component.jsonb.converter.JsonbTypeConverters();
+            CamelContextAware.trySetCamelContext(jsonbTypeConverters, 
camelContext);
+        }
+        return jsonbTypeConverters;
+    }
+}
diff --git 
a/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..f04aaa6
--- /dev/null
+++ 
b/components/camel-jsonb/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+org.apache.camel.component.jsonb.converter.JsonbTypeConvertersLoader
diff --git 
a/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java
 
b/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java
new file mode 100644
index 0000000..39991c2
--- /dev/null
+++ 
b/components/camel-jsonb/src/main/java/org/apache/camel/component/jsonb/converter/JsonbTypeConverters.java
@@ -0,0 +1,58 @@
+/*
+ * 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.jsonb.converter;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+/**
+ * JsonB {@link org.apache.camel.TypeConverter} that allows converting json to 
byte buffer/stream oriented output. <br/>
+ * This implementation uses a fallback converter.
+ */
+@Converter(generateLoader = true)
+public final class JsonbTypeConverters {
+
+    private final Jsonb objectMapper;
+
+    public JsonbTypeConverters() {
+        // Default configuration should be okey for conversion purpose
+        objectMapper = JsonbBuilder.create();
+    }
+
+    @Converter(fallback = true)
+    public <T> T convertTo(Class<T> type, Exchange exchange, Object value, 
TypeConverterRegistry registry) throws Exception {
+        if (ByteBuffer.class.isAssignableFrom(type)) {
+            byte[] out = 
objectMapper.toJson(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(ByteBuffer.wrap(out));
+        } else if (InputStream.class.isAssignableFrom(type)) {
+            byte[] out = 
objectMapper.toJson(value).getBytes(StandardCharsets.UTF_8);
+            return type.cast(new ByteArrayInputStream(out));
+        }
+
+        return null;
+    }
+
+}
diff --git 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
 
b/components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java
similarity index 63%
rename from 
components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
rename to 
components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java
index e91f69c..961517b 100644
--- 
a/components/camel-jackson/src/test/java/org/apache/camel/component/jackson/converter/JacksonConversionsBufferTest.java
+++ 
b/components/camel-jsonb/src/test/java/org/apache/camel/component/jsonb/converter/JsonbConversionsTest.java
@@ -14,49 +14,58 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.jackson.converter;
+package org.apache.camel.component.jsonb.converter;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
-import org.apache.camel.CamelContext;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.jackson.JacksonConstants;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class JacksonConversionsBufferTest extends CamelTestSupport {
+public class JsonbConversionsTest extends CamelTestSupport {
 
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-        // enable jackson type converter by setting this property on
-        // CamelContext
-        context.getGlobalOptions().put(JacksonConstants.ENABLE_TYPE_CONVERTER, 
"true");
-        return context;
+    @Test
+    public void shouldConvertMapToByteBuffer() {
+        String name = "someName";
+        Map<String, String> pojoAsMap = new HashMap<>();
+        pojoAsMap.put("name", name);
+        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:bytebuffer", pojoAsMap);
+
+        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
     }
 
     @Test
-    public void shouldConvertMapToByteBuffer() {
+    public void shouldConvertMapToInputStream() {
         String name = "someName";
         Map<String, String> pojoAsMap = new HashMap<>();
         pojoAsMap.put("name", name);
+        InputStream testInputStream = (InputStream) 
template.requestBody("direct:inputstream", pojoAsMap);
 
-        ByteBuffer testByteBuffer = (ByteBuffer) 
template.requestBody("direct:test", pojoAsMap);
+        String text = new BufferedReader(
+                new InputStreamReader(testInputStream, StandardCharsets.UTF_8))
+                        .lines()
+                        .collect(Collectors.joining("\n"));
 
-        assertEquals("{\"name\":\"someName\"}", 
StandardCharsets.UTF_8.decode(testByteBuffer).toString());
+        assertEquals("{\"name\":\"someName\"}", text);
     }
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
+
             @Override
             public void configure() throws Exception {
-                from("direct:test").convertBodyTo(ByteBuffer.class);
+                from("direct:bytebuffer").convertBodyTo(ByteBuffer.class);
+                from("direct:inputstream").convertBodyTo(InputStream.class);
             }
         };
     }
diff --git 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
index fab52af..80b99c2 100644
--- 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
+++ 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpSupport.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.platform.http.vertx;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -166,26 +167,36 @@ public final class VertxPlatformHttpSupport {
         } else if (body instanceof String) {
             response.end((String) body);
         } else if (body instanceof InputStream) {
-            final byte[] bytes = new byte[4096];
-            try (InputStream in = (InputStream) body) {
-                int len;
-                while ((len = in.read(bytes)) >= 0) {
-                    final Buffer b = Buffer.buffer(len);
-                    b.appendBytes(bytes, 0, len);
-                    response.write(b);
-                }
-            }
-            response.end();
+            writeResponseAs(response, (InputStream) body);
         } else if (body instanceof Buffer) {
             response.end((Buffer) body);
         } else {
             final TypeConverter tc = 
camelExchange.getContext().getTypeConverter();
-            final ByteBuffer bb = tc.mandatoryConvertTo(ByteBuffer.class, 
camelExchange, body);
-            final Buffer b = Buffer.buffer(bb.capacity());
+            // Try to convert to ByteBuffer for performance reason
+            final ByteBuffer bb = tc.tryConvertTo(ByteBuffer.class, 
camelExchange, body);
+            if (bb != null) {
+                final Buffer b = Buffer.buffer(bb.capacity());
+                b.setBytes(0, bb);
+                response.end(b);
+            } else {
+                // Otherwise fallback to most generic InputStream conversion
+                final InputStream is = 
tc.mandatoryConvertTo(InputStream.class, camelExchange, body);
+                writeResponseAs(response, is);
+            }
+        }
+    }
 
-            b.setBytes(0, bb);
-            response.end(b);
+    private static void writeResponseAs(HttpServerResponse response, 
InputStream is) throws IOException {
+        final byte[] bytes = new byte[4096];
+        try (InputStream in = is) {
+            int len;
+            while ((len = in.read(bytes)) >= 0) {
+                final Buffer b = Buffer.buffer(len);
+                b.appendBytes(bytes, 0, len);
+                response.write(b);
+            }
         }
+        response.end();
     }
 
     static void populateCamelHeaders(
diff --git 
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
index 877da29..e8b3b36 100644
--- 
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
+++ 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineTest.java
@@ -486,11 +486,11 @@ public class VertxPlatformHttpEngineTest {
         }
     }
 
-    private CamelContext createCamelContext() throws Exception {
+    static CamelContext createCamelContext() throws Exception {
         return createCamelContext(null);
     }
 
-    private CamelContext createCamelContext(ServerConfigurationCustomizer 
customizer) throws Exception {
+    private static CamelContext 
createCamelContext(ServerConfigurationCustomizer customizer) throws Exception {
         int port = AvailablePortFinder.getNextAvailable();
         VertxPlatformHttpServerConfiguration conf = new 
VertxPlatformHttpServerConfiguration();
         conf.setBindPort(port);
diff --git 
a/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java
 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java
new file mode 100644
index 0000000..f38d3bb
--- /dev/null
+++ 
b/components/camel-platform-http-vertx/src/test/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpEngineWithTypeConverterTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.platform.http.vertx;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.jupiter.api.Test;
+
+import static io.restassured.RestAssured.given;
+import static org.hamcrest.Matchers.equalTo;
+
+public class VertxPlatformHttpEngineWithTypeConverterTest {
+
+    @Test
+    public void testByteBufferConversion() throws Exception {
+        final CamelContext context = 
VertxPlatformHttpEngineTest.createCamelContext();
+
+        TypeConverter tc = mockByteBufferTypeConverter();
+        context.getTypeConverterRegistry().addTypeConverter(ByteBuffer.class, 
Map.class, tc);
+
+        try {
+            context.addRoutes(new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                    from("platform-http:/bytebuffer")
+                            .routeId("bytebuffer")
+                            .setBody().constant(Collections.singletonMap("bb", 
"my-test"));
+                }
+            });
+
+            context.start();
+
+            given()
+                    .when()
+                    .get("/bytebuffer")
+                    .then()
+                    .statusCode(200)
+                    .body(equalTo("ByteBuffer:my-test"));
+        } finally {
+            context.stop();
+        }
+    }
+
+    @Test
+    public void testInputStreamConversion() throws Exception {
+        final CamelContext context = 
VertxPlatformHttpEngineTest.createCamelContext();
+
+        TypeConverter tc = mockInputStreamTypeConverter();
+        context.getTypeConverterRegistry().addTypeConverter(InputStream.class, 
Map.class, tc);
+
+        try {
+            context.addRoutes(new RouteBuilder() {
+                @Override
+                public void configure() throws Exception {
+                    from("platform-http:/inputstream")
+                            .routeId("inputstream")
+                            .setBody().constant(Collections.singletonMap("is", 
"my-test"));
+                }
+            });
+
+            context.start();
+
+            given()
+                    .when()
+                    .get("/inputstream")
+                    .then()
+                    .statusCode(200)
+                    .body(equalTo("InputStream:my-test"));
+        } finally {
+            context.stop();
+        }
+    }
+
+    private TypeConverter mockByteBufferTypeConverter() {
+        return new MockTypeConverter() {
+            @Override
+            public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object 
value) {
+                byte[] out = ("ByteBuffer:" + ((Map) 
value).get("bb")).getBytes(StandardCharsets.UTF_8);
+                return type.cast(ByteBuffer.wrap(out));
+            }
+        };
+    }
+
+    private TypeConverter mockInputStreamTypeConverter() {
+        return new MockTypeConverter() {
+            @Override
+            public <T> T convertTo(Class<T> type, Exchange exchange, Object 
value) throws TypeConversionException {
+                byte[] out = ("InputStream:" + ((Map) 
value).get("is")).getBytes(StandardCharsets.UTF_8);
+                return type.cast(new ByteArrayInputStream(out));
+            }
+
+        };
+    }
+
+    abstract class MockTypeConverter implements TypeConverter {
+        @Override
+        public boolean allowNull() {
+            return false;
+        }
+
+        @Override
+        public <T> T convertTo(Class<T> type, Object value) throws 
TypeConversionException {
+            return null;
+        }
+
+        @Override
+        public <T> T convertTo(Class<T> type, Exchange exchange, Object value) 
throws TypeConversionException {
+            return null;
+        }
+
+        @Override
+        public <T> T mandatoryConvertTo(Class<T> type, Object value)
+                throws TypeConversionException, 
NoTypeConversionAvailableException {
+            return null;
+        }
+
+        @Override
+        public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange, 
Object value)
+                throws TypeConversionException, 
NoTypeConversionAvailableException {
+            return null;
+        }
+
+        @Override
+        public <T> T tryConvertTo(Class<T> type, Object value) {
+            return null;
+        }
+
+        @Override
+        public <T> T tryConvertTo(Class<T> type, Exchange exchange, Object 
value) {
+            return null;
+        }
+    }
+}

Reply via email to