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

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


The following commit(s) were added to refs/heads/main by this push:
     new 48c8454  Test TypeConverters #2537
48c8454 is described below

commit 48c8454299bfe982c665cd49a9a077682e87d14d
Author: JiriOndrusek <[email protected]>
AuthorDate: Wed May 12 10:13:13 2021 +0200

    Test TypeConverters #2537
---
 .../deployment/CustomTypeConverterBuildStep.java   |  15 ++-
 .../custom-type-converter/runtime/pom.xml          |  37 ++++++
 ...portCustomTypeConverterBulkConverterLoader.java |  74 +++++++++++
 .../converters/MyLoaderConverterLoader.java        |  36 ++++++
 .../services/org/apache/camel/TypeConverterLoader  |   2 +
 .../typeconverter/CustomTypeConverterRecorder.java |  11 ++
 .../quarkus/it/support/typeconverter/MyPair.java   |  20 +--
 ...order.java => RegistryPairConverterLoader.java} |  17 ++-
 .../typeconverter/converters/MyBulk1Converter.java |  11 +-
 .../typeconverter/converters/MyBulk2Converter.java |  11 +-
 .../converters/MyLoaderConverter.java              |  11 +-
 .../{MyPair.java => pairs/AbstractPair.java}       |  16 ++-
 .../support/typeconverter/pairs/MyBulk1Pair.java   |  15 +--
 .../support/typeconverter/pairs/MyBulk2Pair.java   |  15 +--
 .../support/typeconverter/pairs/MyLoaderPair.java  |  15 +--
 .../typeconverter/pairs/MyRegistryPair.java        |  15 +--
 integration-tests/core/pom.xml                     |   4 +
 .../camel/quarkus/core/ConverterResource.java      | 137 +++++++++++++++++++++
 .../apache/camel/quarkus/core/CoreResource.java    |  10 --
 .../{AnnotatedMyPair.java => MyExchangePair.java}  |  16 ++-
 ...PairConverter.java => MyNotRegisteredPair.java} |  14 ++-
 ...tedMyPairConverter.java => MyNullablePair.java} |  15 ++-
 ...notatedMyPairConverter.java => MyTestPair.java} |  14 ++-
 ...erter.java => NotRegisteredBulkConverters.java} |   8 +-
 ...Converter.java => NotRegisteredConverters.java} |   8 +-
 .../quarkus/core/converter/TestConverters.java     |  73 +++++++++++
 .../apache/camel/quarkus/core/ConverterIT.java}    |  13 +-
 .../apache/camel/quarkus/core/ConverterTest.java   | 129 +++++++++++++++++++
 .../org/apache/camel/quarkus/core/CoreTest.java    |  14 ---
 29 files changed, 640 insertions(+), 136 deletions(-)

diff --git 
a/integration-tests-support/custom-type-converter/deployment/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/deployment/CustomTypeConverterBuildStep.java
 
b/integration-tests-support/custom-type-converter/deployment/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/deployment/CustomTypeConverterBuildStep.java
index 0fa6664..0efd5d0 100644
--- 
a/integration-tests-support/custom-type-converter/deployment/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/deployment/CustomTypeConverterBuildStep.java
+++ 
b/integration-tests-support/custom-type-converter/deployment/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/deployment/CustomTypeConverterBuildStep.java
@@ -16,16 +16,27 @@
  */
 package org.apache.camel.quarkus.it.support.typeconverter.deployment;
 
+import io.quarkus.deployment.annotations.BuildProducer;
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.annotations.ExecutionTime;
 import io.quarkus.deployment.annotations.Record;
+import org.apache.camel.quarkus.core.deployment.spi.CamelRegistryBuildItem;
 import 
org.apache.camel.quarkus.core.deployment.spi.CamelTypeConverterLoaderBuildItem;
 import 
org.apache.camel.quarkus.it.support.typeconverter.CustomTypeConverterRecorder;
 
 public class CustomTypeConverterBuildStep {
     @Record(ExecutionTime.STATIC_INIT)
     @BuildStep
-    CamelTypeConverterLoaderBuildItem 
typeConverterLoader(CustomTypeConverterRecorder recorder) {
-        return new 
CamelTypeConverterLoaderBuildItem(recorder.createTypeConverterLoader());
+    void typeConverterLoaders(BuildProducer<CamelTypeConverterLoaderBuildItem> 
loaders, CustomTypeConverterRecorder recorder) {
+        loaders.produce(new 
CamelTypeConverterLoaderBuildItem(recorder.createTypeConverterLoader()));
+        loaders.produce(new 
CamelTypeConverterLoaderBuildItem(recorder.getBulkConverterLoader()));
     }
+
+    @Record(ExecutionTime.STATIC_INIT)
+    @BuildStep
+    void bindMyStringConverter(CustomTypeConverterRecorder recorder,
+            CamelRegistryBuildItem registryBuildItem) {
+        
recorder.bindMyRegistryConverterLoader(registryBuildItem.getRegistry());
+    }
+
 }
diff --git a/integration-tests-support/custom-type-converter/runtime/pom.xml 
b/integration-tests-support/custom-type-converter/runtime/pom.xml
index 3d6b05d..63ba7b3 100644
--- a/integration-tests-support/custom-type-converter/runtime/pom.xml
+++ b/integration-tests-support/custom-type-converter/runtime/pom.xml
@@ -67,6 +67,43 @@
                     </annotationProcessorPaths>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-package-maven-plugin</artifactId>
+                <version>${camel.version}</version>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <goals>
+                            <goal>generate-component</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>initialize</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                            <goal>add-resource</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>src/generated/java</source>
+                            </sources>
+                            <resources>
+                                <resource>
+                                    
<directory>src/generated/resources</directory>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader.java
 
b/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader.java
new file mode 100644
index 0000000..0e9fea2
--- /dev/null
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader.java
@@ -0,0 +1,74 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.quarkus.it.support.typeconverter.converters;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Ordered;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.BulkTypeConverters;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public final class 
CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader 
implements TypeConverterLoader, BulkTypeConverters {
+
+    public 
CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader() {
+    }
+
+    @Override
+    public int size() {
+        return 2;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registry.addBulkTypeConverters(this);
+    }
+
+    @Override
+    public <T> T convertTo(Class<?> from, Class<T> to, Exchange exchange, 
Object value) throws TypeConversionException {
+        try {
+            Object obj = doConvertTo(from, to, exchange, value);
+            if (obj == Void.class) {;
+                return null;
+            } else {
+                return (T) obj;
+            }
+        } catch (TypeConversionException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new TypeConversionException(value, to, e);
+        }
+    }
+
+    private Object doConvertTo(Class<?> from, Class<?> to, Exchange exchange, 
Object value) throws Exception {
+        if (to == 
org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk1Pair.class) {
+            if (value instanceof java.lang.String) {
+                return 
org.apache.camel.quarkus.it.support.typeconverter.converters.MyBulk1Converter.toMyPair((java.lang.String)
 value);
+            }
+        } else if (to == 
org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk2Pair.class) {
+            if (value instanceof java.lang.String) {
+                return 
org.apache.camel.quarkus.it.support.typeconverter.converters.MyBulk2Converter.toMyPair((java.lang.String)
 value);
+            }
+        }
+        return null;
+    }
+
+    public TypeConverter lookup(Class<?> to, Class<?> from) {
+        if (to == 
org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk1Pair.class) {
+            if (from == java.lang.String.class) {
+                return this;
+            }
+        } else if (to == 
org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk2Pair.class) {
+            if (from == java.lang.String.class) {
+                return this;
+            }
+        }
+        return null;
+    }
+
+}
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverterLoader.java
 
b/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverterLoader.java
new file mode 100644
index 0000000..9e7c515
--- /dev/null
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/generated/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverterLoader.java
@@ -0,0 +1,36 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.quarkus.it.support.typeconverter.converters;
+
+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")
+public final class MyLoaderConverterLoader implements TypeConverterLoader {
+
+    public MyLoaderConverterLoader() {
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerConverters(registry);
+    }
+
+    private void registerConverters(TypeConverterRegistry registry) {
+        addTypeConverter(registry, 
org.apache.camel.quarkus.it.support.typeconverter.pairs.MyLoaderPair.class, 
java.lang.String.class, false,
+            (type, exchange, value) -> 
org.apache.camel.quarkus.it.support.typeconverter.converters.MyLoaderConverter.toMyPair((java.lang.String)
 value));
+    }
+
+    private static void addTypeConverter(TypeConverterRegistry registry, 
Class<?> toType, Class<?> fromType, boolean allowNull, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addTypeConverter(toType, fromType, new 
SimpleTypeConverter(allowNull, method));
+    }
+
+}
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/integration-tests-support/custom-type-converter/runtime/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
new file mode 100644
index 0000000..73c738d
--- /dev/null
+++ 
b/integration-tests-support/custom-type-converter/runtime/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.quarkus.it.support.typeconverter.converters.MyLoaderConverterLoader
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
index cd9256c..ecef5a1 100644
--- 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
@@ -18,6 +18,8 @@ package org.apache.camel.quarkus.it.support.typeconverter;
 
 import io.quarkus.runtime.RuntimeValue;
 import io.quarkus.runtime.annotations.Recorder;
+import 
org.apache.camel.quarkus.it.support.typeconverter.converters.CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader;
+import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.TypeConverterLoader;
 
 @Recorder
@@ -25,4 +27,13 @@ public class CustomTypeConverterRecorder {
     public RuntimeValue<TypeConverterLoader> createTypeConverterLoader() {
         return new RuntimeValue<>(new CustomTypeConverterLoader());
     }
+
+    public RuntimeValue<TypeConverterLoader> getBulkConverterLoader() {
+        return new RuntimeValue<>(new 
CamelQuarkusIntegrationTestsSupportCustomTypeConverterBulkConverterLoader());
+    }
+
+    public void bindMyRegistryConverterLoader(RuntimeValue<Registry> registry) 
{
+        registry.getValue().bind("myRegistryPairConverter", new 
RegistryPairConverterLoader());
+    }
+
 }
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
index 9259cc1..ae687fe 100644
--- 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
@@ -16,17 +16,21 @@
  */
 package org.apache.camel.quarkus.it.support.typeconverter;
 
-public class MyPair {
-    public final String key;
-    public final String val;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.AbstractPair;
 
-    public MyPair(String key, String val) {
-        this.key = key;
-        this.val = val;
+public class MyPair extends AbstractPair {
+
+    public MyPair(String value) {
+        super(value);
+    }
+
+    @Override
+    protected String keyPrefix() {
+        return "";
     }
 
     public static MyPair fromString(String input) {
-        String[] items = input.split(":");
-        return new MyPair(items[0], items[1]);
+        return new MyPair(input);
     }
+
 }
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/RegistryPairConverterLoader.java
similarity index 59%
copy from 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/RegistryPairConverterLoader.java
index cd9256c..c34883e 100644
--- 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/CustomTypeConverterRecorder.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/RegistryPairConverterLoader.java
@@ -16,13 +16,18 @@
  */
 package org.apache.camel.quarkus.it.support.typeconverter;
 
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyRegistryPair;
 import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
 
-@Recorder
-public class CustomTypeConverterRecorder {
-    public RuntimeValue<TypeConverterLoader> createTypeConverterLoader() {
-        return new RuntimeValue<>(new CustomTypeConverterLoader());
+public class RegistryPairConverterLoader implements TypeConverterLoader {
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registry.addTypeConverter(
+                MyRegistryPair.class,
+                String.class,
+                new SimpleTypeConverter(false, (type, exchange, value) -> new 
MyRegistryPair((String) value)));
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk1Converter.java
similarity index 74%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk1Converter.java
index 187ff91..a19cb51 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk1Converter.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.converters;
 
 import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk1Pair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+@Converter(generateBulkLoader = true)
+public class MyBulk1Converter {
 
     @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public static MyBulk1Pair toMyPair(String s) {
+        return new MyBulk1Pair(s);
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk2Converter.java
similarity index 74%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk2Converter.java
index 187ff91..13749d7 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyBulk2Converter.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.converters;
 
 import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk2Pair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+@Converter(generateBulkLoader = true)
+public class MyBulk2Converter {
 
     @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public static MyBulk2Pair toMyPair(String s) {
+        return new MyBulk2Pair(s);
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverter.java
similarity index 74%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverter.java
index 187ff91..592a4e3 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/converters/MyLoaderConverter.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.converters;
 
 import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyLoaderPair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+@Converter(generateLoader = true)
+public class MyLoaderConverter {
 
     @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public static MyLoaderPair toMyPair(String s) {
+        return new MyLoaderPair(s);
     }
 }
diff --git 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/AbstractPair.java
similarity index 73%
copy from 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/AbstractPair.java
index 9259cc1..e27fd60 100644
--- 
a/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/MyPair.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/AbstractPair.java
@@ -14,19 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.it.support.typeconverter;
+package org.apache.camel.quarkus.it.support.typeconverter.pairs;
 
-public class MyPair {
+public abstract class AbstractPair {
     public final String key;
     public final String val;
 
-    public MyPair(String key, String val) {
-        this.key = key;
-        this.val = val;
-    }
+    protected abstract String keyPrefix();
 
-    public static MyPair fromString(String input) {
-        String[] items = input.split(":");
-        return new MyPair(items[0], items[1]);
+    public AbstractPair(String value) {
+        String[] items = value.split(":");
+        key = keyPrefix() + items[0];
+        val = items[1];
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk1Pair.java
similarity index 76%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk1Pair.java
index 187ff91..5f44417 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk1Pair.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.pairs;
 
-import org.apache.camel.Converter;
+public class MyBulk1Pair extends AbstractPair {
 
-@Converter
-public class AnnotatedMyPairConverter {
+    public MyBulk1Pair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "bulk1_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk2Pair.java
similarity index 76%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk2Pair.java
index 187ff91..82c59f4 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyBulk2Pair.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.pairs;
 
-import org.apache.camel.Converter;
+public class MyBulk2Pair extends AbstractPair {
 
-@Converter
-public class AnnotatedMyPairConverter {
+    public MyBulk2Pair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "bulk2_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyLoaderPair.java
similarity index 76%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyLoaderPair.java
index 187ff91..e9b97e1 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyLoaderPair.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.pairs;
 
-import org.apache.camel.Converter;
+public class MyLoaderPair extends AbstractPair {
 
-@Converter
-public class AnnotatedMyPairConverter {
+    public MyLoaderPair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "loader_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyRegistryPair.java
similarity index 75%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyRegistryPair.java
index 187ff91..cec5352 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests-support/custom-type-converter/runtime/src/main/java/org/apache/camel/quarkus/it/support/typeconverter/pairs/MyRegistryPair.java
@@ -14,15 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.it.support.typeconverter.pairs;
 
-import org.apache.camel.Converter;
+public class MyRegistryPair extends AbstractPair {
 
-@Converter
-public class AnnotatedMyPairConverter {
+    public MyRegistryPair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "registry_";
     }
 }
diff --git a/integration-tests/core/pom.xml b/integration-tests/core/pom.xml
index 83fc026..65b6485 100644
--- a/integration-tests/core/pom.xml
+++ b/integration-tests/core/pom.xml
@@ -63,6 +63,10 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            
<artifactId>camel-quarkus-integration-tests-support-custom-type-converter</artifactId>
+        </dependency>
 
         <!-- test dependencies -->
         <dependency>
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/ConverterResource.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/ConverterResource.java
new file mode 100644
index 0000000..ac67654
--- /dev/null
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/ConverterResource.java
@@ -0,0 +1,137 @@
+/*
+ * 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.quarkus.core;
+
+import java.util.Map;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.quarkus.core.converter.MyExchangePair;
+import org.apache.camel.quarkus.core.converter.MyNotRegisteredPair;
+import org.apache.camel.quarkus.core.converter.MyNullablePair;
+import org.apache.camel.quarkus.core.converter.MyTestPair;
+import org.apache.camel.quarkus.core.converter.TestConverters;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk1Pair;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyBulk2Pair;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyLoaderPair;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.MyRegistryPair;
+import org.apache.camel.spi.Registry;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.util.CollectionHelper;
+
+@Path("/converter")
+@ApplicationScoped
+public class ConverterResource {
+    @Inject
+    Registry registry;
+    @Inject
+    CamelContext context;
+
+    @Path("/myRegistryPair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyRegistryPair converterMyRegistrPair(String input) {
+        return context.getTypeConverter().convertTo(MyRegistryPair.class, 
input);
+    }
+
+    @Path("/myTestPair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyTestPair fromStringToMyTestPair(String input) {
+        return context.getTypeConverter().convertTo(MyTestPair.class, input);
+    }
+
+    @Path("/myLoaderPair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyLoaderPair fromMyLoaderPair(String input) {
+        return context.getTypeConverter().convertTo(MyLoaderPair.class, input);
+    }
+
+    @Path("/myBulk1Pair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyBulk1Pair convertMyBulk1Pair(String input) {
+        return context.getTypeConverter().convertTo(MyBulk1Pair.class, input);
+    }
+
+    @Path("/myBulk2Pair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyBulk2Pair convertMyBulk2Pair(String input) {
+        return context.getTypeConverter().convertTo(MyBulk2Pair.class, input);
+    }
+
+    @Path("/myNullablePair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyNullablePair convertMyNullablePair(String input) {
+        return context.getTypeConverter().convertTo(MyNullablePair.class, 
input);
+    }
+
+    @Path("/setStatisticsEnabled")
+    @POST
+    @Produces(MediaType.TEXT_PLAIN)
+    public void cnverterSetStatisticsEnabled(boolean value) {
+        
context.getTypeConverterRegistry().getStatistics().setStatisticsEnabled(value);
+        if (value) {
+            context.getTypeConverterRegistry().getStatistics().reset();
+        }
+    }
+
+    @Path("/getStatisticsHit")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public Map<String, Long> converterGetStatistics() {
+        long hit = 
context.getTypeConverterRegistry().getStatistics().getHitCounter();
+        long miss = 
context.getTypeConverterRegistry().getStatistics().getMissCounter();
+        return CollectionHelper.mapOf("hit", hit, "miss", miss);
+    }
+
+    @Path("/fallback")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyTestPair convertFallback(String input) {
+        return context.getTypeConverter().convertTo(MyTestPair.class,
+                "org.apache.camel.quarkus.core.converter.MyTestPair:" + input);
+    }
+
+    @Path("/myExchangePair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyExchangePair convertMyExchangePair(String input, 
@QueryParam("converterValue") String converterValue) {
+        Exchange e = new DefaultExchange(context);
+        e.setProperty(TestConverters.CONVERTER_VALUE, converterValue);
+        return context.getTypeConverter().convertTo(MyExchangePair.class, e, 
input);
+    }
+
+    @Path("/myNotRegisteredPair")
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    public MyNotRegisteredPair convertNotRegisteredPair(String input, 
@QueryParam("converterValue") String converterValue) {
+        return context.getTypeConverter().convertTo(MyNotRegisteredPair.class, 
input);
+    }
+}
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
index 9d57144..00a951c 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/CoreResource.java
@@ -29,7 +29,6 @@ import javax.inject.Inject;
 import javax.json.Json;
 import javax.json.JsonObject;
 import javax.ws.rs.GET;
-import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -47,7 +46,6 @@ import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.component.log.LogComponent;
 import org.apache.camel.impl.engine.DefaultHeadersMapFactory;
 import org.apache.camel.model.ModelCamelContext;
-import org.apache.camel.quarkus.core.converter.AnnotatedMyPair;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.support.LRUCacheFactory;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
@@ -271,12 +269,4 @@ public class CoreResource {
     public boolean startupStepRecorder() {
         return 
context.adapt(ExtendedCamelContext.class).getStartupStepRecorder() instanceof 
DefaultStartupStepRecorder;
     }
-
-    @Path("/converter/annotatedMyPair")
-    @POST
-    @Produces(MediaType.APPLICATION_JSON)
-    public AnnotatedMyPair fromStringToAnnotatedMyPair(String input) {
-        return context.getTypeConverter().convertTo(AnnotatedMyPair.class, 
input);
-    }
-
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPair.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyExchangePair.java
similarity index 68%
rename from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPair.java
rename to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyExchangePair.java
index 1d9daca..15a86fc 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPair.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyExchangePair.java
@@ -16,17 +16,15 @@
  */
 package org.apache.camel.quarkus.core.converter;
 
-public class AnnotatedMyPair {
-    public final String key;
-    public final String annotatedValue;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.AbstractPair;
 
-    public AnnotatedMyPair(String key, String annotatedValue) {
-        this.key = key;
-        this.annotatedValue = annotatedValue;
+public class MyExchangePair extends AbstractPair {
+    public MyExchangePair(String value) {
+        super(value);
     }
 
-    public static AnnotatedMyPair fromString(String input) {
-        String[] items = input.split(":");
-        return new AnnotatedMyPair(items[0], items[1]);
+    @Override
+    protected String keyPrefix() {
+        return "exchange_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNotRegisteredPair.java
similarity index 74%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNotRegisteredPair.java
index 187ff91..cb8dcf6 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNotRegisteredPair.java
@@ -16,13 +16,15 @@
  */
 package org.apache.camel.quarkus.core.converter;
 
-import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.AbstractPair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+public class MyNotRegisteredPair extends AbstractPair {
+    public MyNotRegisteredPair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "not_registered_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNullablePair.java
similarity index 76%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNullablePair.java
index 187ff91..ad64bcc 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyNullablePair.java
@@ -16,13 +16,16 @@
  */
 package org.apache.camel.quarkus.core.converter;
 
-import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.AbstractPair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+public class MyNullablePair extends AbstractPair {
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public MyNullablePair(String value) {
+        super(value);
+    }
+
+    @Override
+    protected String keyPrefix() {
+        return "test_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyTestPair.java
similarity index 76%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyTestPair.java
index 187ff91..842a071 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/MyTestPair.java
@@ -16,13 +16,15 @@
  */
 package org.apache.camel.quarkus.core.converter;
 
-import org.apache.camel.Converter;
+import org.apache.camel.quarkus.it.support.typeconverter.pairs.AbstractPair;
 
-@Converter
-public class AnnotatedMyPairConverter {
+public class MyTestPair extends AbstractPair {
+    public MyTestPair(String value) {
+        super(value);
+    }
 
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    @Override
+    protected String keyPrefix() {
+        return "test_";
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredBulkConverters.java
similarity index 82%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredBulkConverters.java
index 187ff91..ce8040b 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredBulkConverters.java
@@ -18,11 +18,11 @@ package org.apache.camel.quarkus.core.converter;
 
 import org.apache.camel.Converter;
 
-@Converter
-public class AnnotatedMyPairConverter {
+@Converter(generateBulkLoader = true)
+public class NotRegisteredBulkConverters {
 
     @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public static MyNotRegisteredPair toNotRegisteredPair(String s) {
+        return new MyNotRegisteredPair(s);
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredConverters.java
similarity index 83%
copy from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
copy to 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredConverters.java
index 187ff91..067461d 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/NotRegisteredConverters.java
@@ -18,11 +18,11 @@ package org.apache.camel.quarkus.core.converter;
 
 import org.apache.camel.Converter;
 
-@Converter
-public class AnnotatedMyPairConverter {
+@Converter(generateLoader = true)
+public class NotRegisteredConverters {
 
     @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
+    public static MyNotRegisteredPair toNotRegisteredPair(String s) {
+        return new MyNotRegisteredPair(s);
     }
 }
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/TestConverters.java
 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/TestConverters.java
new file mode 100644
index 0000000..6e76677
--- /dev/null
+++ 
b/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/TestConverters.java
@@ -0,0 +1,73 @@
+/*
+ * 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.quarkus.core.converter;
+
+import org.apache.camel.Converter;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.spi.TypeConverterRegistry;
+
+@Converter
+public class TestConverters {
+
+    public static final String CONVERTER_VALUE = "converter_value";
+
+    @Converter(allowNull = true)
+    public static MyNullablePair toNullablePair(String s) {
+        if ("null".equals(s)) {
+            return null;
+        }
+        return new MyNullablePair(s);
+    }
+
+    @Converter
+    public static MyTestPair toMyPair(String s) {
+        if (s.split(":").length != 2) {
+            return null;
+        }
+        return new MyTestPair(s);
+    }
+
+    @Converter
+    public static MyExchangePair toMyPair(String s, Exchange exchange) {
+        String converter_value = exchange.getProperty(CONVERTER_VALUE, 
String.class);
+        if (converter_value != null && converter_value.split(":").length == 2) 
{
+            return new MyExchangePair(converter_value);
+        }
+        if (s.split(":").length != 2) {
+            return null;
+        }
+        return new MyExchangePair(s);
+    }
+
+    @Converter(fallback = true)
+    public static Object convertTo(Class type, Exchange exchange, Object 
value, TypeConverterRegistry registry)
+            throws ClassNotFoundException {
+        if (value instanceof String) {
+            String s = (String) value;
+            String[] tokens = s.split(":");
+            if (tokens.length == 3) {
+                Class convertTo = Class.forName(tokens[0]);
+                TypeConverter tc = registry.lookup(convertTo, String.class);
+                if (tc != null) {
+                    return tc.convertTo(convertTo, s.replaceFirst(tokens[0] + 
":", ""));
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterIT.java
similarity index 75%
rename from 
integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
rename to 
integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterIT.java
index 187ff91..5400e13 100644
--- 
a/integration-tests/core/src/main/java/org/apache/camel/quarkus/core/converter/AnnotatedMyPairConverter.java
+++ 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterIT.java
@@ -14,15 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.core.converter;
+package org.apache.camel.quarkus.core;
 
-import org.apache.camel.Converter;
+import io.quarkus.test.junit.NativeImageTest;
 
-@Converter
-public class AnnotatedMyPairConverter {
-
-    @Converter
-    public static AnnotatedMyPair toMyPair(String s) {
-        return AnnotatedMyPair.fromString(s);
-    }
+@NativeImageTest
+public class ConverterIT extends ConverterTest {
 }
diff --git 
a/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterTest.java
 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterTest.java
new file mode 100644
index 0000000..5c22781
--- /dev/null
+++ 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/ConverterTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.quarkus.core;
+
+import javax.ws.rs.core.MediaType;
+
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+import io.restassured.response.ValidatableResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.Matchers.*;
+
+@QuarkusTest
+public class ConverterTest {
+
+    @Test
+    void testConverterFromRegistry() {
+        //converter from loader which is present in registry
+        testConverter("/converter/myRegistryPair", "a:b", "registry_a", "b");
+    }
+
+    @Test
+    void testConverterFromAnnotation() {
+        //converter with annotation present in this module
+        testConverter("/converter/myTestPair", "a:b", "test_a", "b");
+    }
+
+    @Test
+    void testConverterToNull() {
+        enableStatistics(true);
+
+        testConverterReturningNull("/converter/myNullablePair", "null");
+
+        
RestAssured.when().get("/converter/getStatisticsHit").then().body("hit", is(1), 
"miss", is(0));
+
+        enableStatistics(false);
+    }
+
+    @Test
+    void testNotRegisteredConverter() {
+        enableStatistics(true);
+
+        testConverterReturningNull("/converter/myNotRegisteredPair", "a:b");
+
+        
RestAssured.when().get("/converter/getStatisticsHit").then().body("hit", is(0), 
"miss", is(1));
+
+        enableStatistics(false);
+    }
+
+    @Test
+    void testBulkConverters() {
+        //converters generated with @Converter(generateBulkLoader = true)
+        testConverter("/converter/myBulk1Pair", "a:b", "bulk1_a", "b");
+        testConverter("/converter/myBulk2Pair", "a:b", "bulk2_a", "b");
+    }
+
+    @Test
+    void testLoaderConverters() {
+        //converters generated with @Converter(generateLoader = true)
+        testConverter("/converter/myLoaderPair", "a:b", "loader_a", "b");
+    }
+
+    @Test
+    void testFallback() {
+        testConverter("/converter/fallback", "a:b", "test_a", "b");
+    }
+
+    @Test
+    void testExchangeConverter() {
+        testConverter("/converter/fallback", "c:d", "test_c", "d");
+    }
+
+    @Test
+    void testConverterGetStatistics() {
+        enableStatistics(true);
+
+        //cause 1 hit
+        testConverterFromAnnotation();
+
+        
RestAssured.when().get("/converter/getStatisticsHit").then().body("hit", is(1), 
"miss", is(0));
+
+        enableStatistics(false);
+    }
+
+    private void enableStatistics(boolean b) {
+        RestAssured.given()
+                .contentType(ContentType.TEXT).body(b)
+                .post("/converter/setStatisticsEnabled")
+                .then()
+                .statusCode(204);
+    }
+
+    private void testConverterReturningNull(String url, String body) {
+        testConverter(url, body, 204, null, null);
+    }
+
+    private void testConverter(String url, String body, String expectedKey, 
String expectedValue) {
+        testConverter(url, body, 200, expectedKey, expectedValue);
+    }
+
+    private void testConverter(String url, String body, int expectedResutCode, 
String expectedKey, String expectedValue) {
+        ValidatableResponse response = RestAssured.given()
+                .contentType(ContentType.TEXT).body(body)
+                .accept(MediaType.APPLICATION_JSON)
+                .post(url)
+                .then()
+                .statusCode(expectedResutCode);
+
+        if (expectedKey != null) {
+            response.body("key", is(expectedKey), "val", is(expectedValue));
+        }
+    }
+}
diff --git 
a/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
index f94e9fc..82f9874 100644
--- 
a/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
+++ 
b/integration-tests/core/src/test/java/org/apache/camel/quarkus/core/CoreTest.java
@@ -19,11 +19,8 @@ package org.apache.camel.quarkus.core;
 import java.io.IOException;
 import java.net.HttpURLConnection;
 
-import javax.ws.rs.core.MediaType;
-
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
 import io.restassured.response.Response;
 import org.apache.camel.support.DefaultLRUCacheFactory;
 import org.junit.jupiter.api.Test;
@@ -131,15 +128,4 @@ public class CoreTest {
     void testStartupStepRecorder() {
         
RestAssured.when().get("/core/startup-step-recorder").then().body(is("true"));
     }
-
-    @Test
-    void testConverterFromAnnotation() {
-        RestAssured.given()
-                .contentType(ContentType.TEXT).body("a:b")
-                .accept(MediaType.APPLICATION_JSON)
-                .post("/core/converter/annotatedMyPair")
-                .then()
-                .statusCode(200)
-                .body("key", is("a"), "annotatedValue", is("b"));
-    }
 }

Reply via email to