You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/02/01 13:47:11 UTC

[camel-spring-boot] 01/04: CAMEL-16111: camel-spring-boot starters fix issue when end users are using their own customer converter in Spring Boot then Camel converters cannot be found by Spring Boot. Thanks to Krzysztof Jamroz for reporting and suggest fix.

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

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

commit d4c3f97324365c65e5d346516f8728f9df489b8d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Feb 1 13:50:41 2021 +0100

    CAMEL-16111: camel-spring-boot starters fix issue when end users are using their own customer converter in Spring Boot then Camel converters cannot be found by Spring Boot. Thanks to Krzysztof Jamroz for reporting and suggest fix.
---
 .../maven/SpringBootAutoConfigurationMojo.java     | 55 ++++++++--------------
 1 file changed, 20 insertions(+), 35 deletions(-)

diff --git a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
index 6b9cae5..19e1e8d 100644
--- a/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
+++ b/tooling/camel-spring-boot-generator-maven-plugin/src/main/java/org/apache/camel/springboot/maven/SpringBootAutoConfigurationMojo.java
@@ -1277,7 +1277,6 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.getJavaDoc().setFullText("Generated by camel-package-maven-plugin - do not edit this file!");
         javaClass.addAnnotation(Generated.class).setStringValue("value", SpringBootAutoConfigurationMojo.class.getName());
         javaClass.addAnnotation(Configuration.class).setLiteralValue("proxyBeanMethods", "false");
-        javaClass.addAnnotation(AutoConfigureAfter.class).setLiteralValue("CamelAutoConfiguration.class");
         javaClass.addAnnotation(Conditional.class).setLiteralValue("ConditionalOnCamelContextAndAutoConfigurationBeans.class");
         javaClass.addAnnotation(EnableConfigurationProperties.class)
                 .setLiteralValue("{ComponentConfigurationProperties.class," + configurationName + ".class}");
@@ -1287,8 +1286,14 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                         "value",
                         new String[]{"camel.component", "camel.component." + componentName});
 
+        if (complexOptions) {
+            String cn = name.replace("ComponentAutoConfiguration", "ComponentConverter");
+            javaClass.addAnnotation(AutoConfigureAfter.class).setLiteralValue("{CamelAutoConfiguration.class, " + cn + ".class}");
+        } else {
+            javaClass.addAnnotation(AutoConfigureAfter.class).setLiteralValue("CamelAutoConfiguration.class");
+        }
+
         javaClass.addImport(ApplicationContext.class);
-        javaClass.addImport("org.springframework.boot.convert.ApplicationConversionService");
         javaClass.addImport("org.apache.camel.CamelContext");
         javaClass.addImport("org.apache.camel.Component");
         javaClass.addImport("org.apache.camel.spi.ComponentCustomizer");
@@ -1303,15 +1308,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.addField().setPrivate().setFinal(true).setName("camelContext").setType(loadClass("org.apache.camel.CamelContext"));
         javaClass.addField().setPrivate().setName("configuration").setType(configClass).addAnnotation(Autowired.class);
 
-        String converterClassName = name.replace("ComponentAutoConfiguration", "ComponentConverter");
         Method ctr = javaClass.addMethod().setConstructor(true).setPublic().setName(name).addParameter("org.apache.camel.CamelContext", "camelContext");
-        if (complexOptions) {
-            ctr.setBody("this.camelContext = camelContext;\n"
-                    + "ApplicationConversionService acs = (ApplicationConversionService) ApplicationConversionService.getSharedInstance();\n"
-                    + "acs.addConverter(new " + converterClassName + "(camelContext));\n");
-        } else {
-            ctr.setBody("this.camelContext = camelContext;\n");
-        }
+        ctr.setBody("this.camelContext = camelContext;\n");
 
         // add method for auto configure
         String body = createComponentBody(model.getShortJavaType(), componentName);
@@ -1322,7 +1320,6 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
                 .setPublic()
                 .setBody(body)
                 .setReturnType(loadType("org.apache.camel.spi.ComponentCustomizer"));
-
         method.addAnnotation(Lazy.class);
         method.addAnnotation(Bean.class);
 
@@ -1343,16 +1340,16 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.setName(name);
         javaClass.getJavaDoc().setFullText("Generated by camel-package-maven-plugin - do not edit this file!");
         javaClass.addAnnotation(Generated.class).setStringValue("value", SpringBootAutoConfigurationMojo.class.getName());
+        javaClass.addAnnotation(Configuration.class).setLiteralValue("proxyBeanMethods", "false");
+        javaClass.addAnnotation("org.springframework.boot.context.properties.ConfigurationPropertiesBinding");
+        javaClass.addAnnotation("org.springframework.stereotype.Component");
         javaClass.addImport("java.util.LinkedHashSet");
         javaClass.addImport("java.util.Set");
-        javaClass.addImport("org.apache.camel.CamelContext");
         javaClass.addImport("org.springframework.core.convert.TypeDescriptor");
         javaClass.addImport("org.springframework.core.convert.converter.GenericConverter");
 
-        javaClass.implementInterface("org.springframework.core.convert.converter.GenericConverter");
-        javaClass.addField().setPrivate().setFinal(true).setName("camelContext").setType(loadClass("org.apache.camel.CamelContext"));
-        javaClass.addMethod().setConstructor(true).setPublic().setName(name).addParameter("org.apache.camel.CamelContext", "camelContext")
-                .setBody("this.camelContext = camelContext;\n");
+        javaClass.implementInterface("GenericConverter");
+        javaClass.addField().setPrivate().setName("applicationContext").setType(loadClass("org.springframework.context.ApplicationContext")).addAnnotation(Autowired.class);
 
         String body = createConverterPairBody(model);
         javaClass.addMethod().setName("getConvertibleTypes").setPublic().setReturnType("Set<ConvertiblePair>")
@@ -1367,6 +1364,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
 
         String fileName = packageName.replaceAll("\\.", "\\/") + "/" + name + ".java";
         writeSourceIfChanged(javaClass, fileName, false);
+
+        writeComponentSpringFactorySource(packageName, name);
     }
 
     private String createConvertBody(ComponentModel model) {
@@ -1383,7 +1382,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         // we need complex types only which unique types only
         Stream<String> s = model.getComponentOptions().stream().filter(this::isComplexType).map(SpringBootAutoConfigurationMojo::getJavaType).distinct();
         s.forEach(type -> {
-            sb.append("    case \"").append(type).append("\": return camelContext.getRegistry().lookupByNameAndType(ref, ").append(type).append(".class);\n");
+            sb.append("    case \"").append(type).append("\": return applicationContext.getBean(ref, ").append(type).append(".class);\n");
         });
         sb.append("}\n");
         sb.append("return null;\n");
@@ -1404,7 +1403,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         // we need complex types only which unique types only
         Stream<String> s = model.getOptions().stream().filter(this::isComplexType).map(SpringBootAutoConfigurationMojo::getJavaType).distinct();
         s.forEach(type -> {
-            sb.append("    case \"").append(type).append("\": return camelContext.getRegistry().lookupByNameAndType(ref, ").append(type).append(".class);\n");
+            sb.append("    case \"").append(type).append("\": return applicationContext.getBean(ref, ").append(type).append(".class);\n");
         });
         sb.append("}\n");
         sb.append("return null;\n");
@@ -1425,7 +1424,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         // we need complex types only which unique types only
         Stream<String> s = model.getOptions().stream().filter(this::isComplexType).map(SpringBootAutoConfigurationMojo::getJavaType).distinct();
         s.forEach(type -> {
-            sb.append("    case \"").append(type).append("\": return camelContext.getRegistry().lookupByNameAndType(ref, ").append(type).append(".class);\n");
+            sb.append("    case \"").append(type).append("\": return applicationContext.getBean(ref, ").append(type).append(".class);\n");
         });
         sb.append("}\n");
         sb.append("return null;\n");
@@ -1514,15 +1513,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.addField().setPrivate().setFinal(true).setName("camelContext").setType(loadClass("org.apache.camel.CamelContext"));
         javaClass.addField().setPrivate().setName("configuration").setType(configClass).addAnnotation(Autowired.class);
 
-        String converterClassName = name.replace("DataFormatAutoConfiguration", "DataFormatConverter");
         Method ctr = javaClass.addMethod().setConstructor(true).setPublic().setName(name).addParameter("org.apache.camel.CamelContext", "camelContext");
-        if (complexOptions) {
-            ctr.setBody("this.camelContext = camelContext;\n"
-                    + "ApplicationConversionService acs = (ApplicationConversionService) ApplicationConversionService.getSharedInstance();\n"
-                    + "acs.addConverter(new " + converterClassName + "(camelContext));\n");
-        } else {
-            ctr.setBody("this.camelContext = camelContext;\n");
-        }
+        ctr.setBody("this.camelContext = camelContext;\n");
 
         String body = createDataFormatBody(model.getShortJavaType(), dataformatName);
         String methodName = "configure" + model.getShortJavaType() + "Factory";
@@ -1619,15 +1611,8 @@ public class SpringBootAutoConfigurationMojo extends AbstractSpringBootGenerator
         javaClass.addField().setPrivate().setFinal(true).setName("camelContext").setType(loadClass("org.apache.camel.CamelContext"));
         javaClass.addField().setPrivate().setName("configuration").setType(configClass).addAnnotation(Autowired.class);
 
-        String converterClassName = name.replace("LanguageAutoConfiguration", "LanguageConverter");
         Method ctr = javaClass.addMethod().setConstructor(true).setPublic().setName(name).addParameter("org.apache.camel.CamelContext", "camelContext");
-        if (complexOptions) {
-            ctr.setBody("this.camelContext = camelContext;\n"
-                    + "ApplicationConversionService acs = (ApplicationConversionService) ApplicationConversionService.getSharedInstance();\n"
-                    + "acs.addConverter(new " + converterClassName + "(camelContext));\n");
-        } else {
-            ctr.setBody("this.camelContext = camelContext;\n");
-        }
+        ctr.setBody("this.camelContext = camelContext;\n");
 
         String body = createLanguageBody(model.getShortJavaType(), languageName);
         String methodName = "configure" + model.getShortJavaType();