使用 spring boot 2.2.4 更新到 camel 3.0.0-RC3 后,Camel 在文本属性中找不到 {{xxx}}

Camel cannot find {{xxx}} in properties from text after update to camel 3.0.0-RC3 using spring boot 2.2.4

我使用的是 spring boot 2.2.4.RELEASE 和 camel 版本 2.23.0

为了使 camel 能够访问属性并使用 {{ }}

在 uri 路由中使用它们

添加 camel-spring-boot-starter 依赖项并定义 PropertySourcesPlaceholderConfigurerSpringCamelContext bean 足以使其工作

@SpringBootApplication
@PropertySource(ignoreResourceNotFound = false, value= {"classpath:myProperties.properties"})
public class MyApp {

    ...
    @Bean
    public SpringCamelContext camelContext(ApplicationContext applicationContext) {
        return new SpringCamelContext(applicationContext);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

--

现在,在我按照迁移指南将 camel-spring-boot-starter 更新为 3.0.0-RC3 并修复了组件的导入之后。在运行时,骆驼找不到属性,我得到这个:

Property with key [xxx] not found in properties from text: activemq:queue:{{xxx}}

任何想法有什么变化以及为什么 {{ }} 在我的路线中不再起作用?


更新 1

我将 spring 引导更新为 2.2.6.RELEASE,将 camel-spring-boot-starterorg.apache.camel.springboot 更新为 3.2.0 我仍然得到同样的结果...

路线并不花哨。

我需要 {{ }}myProperties.properties

中读取 xxx

使用@Value("${xxx}")有效,spring可以访问它,我可以将它传递给路由URI字符串。

访问 {{xxx}} 中的骆驼 URI 是更新后停止工作的。

@Component
public class MyRoutes extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("activemq:queue:{{xxx}}")
            .to("activemq:topic:targetTopic");
    }
}

更新 2

我复制了接受答案所做的测试。删除 SpringCamelContextPropertySourcesPlaceholderConfigurer bean 就成功了。

我删除了 bean SpringCamelContext 并且它起作用了。显然这个新的 spring camel starter 自己处理 SpringCamelContext 并且我的 bean 使用 {{ }}

覆盖了与 camel 读取属性相关的自动配置

我也删除了 bean PropertySourcesPlaceholderConfigurer 并且 @Value 没有停止工作。

您是否在 spring 启动应用程序中使用 application.properties 文件?如果是这样,{{}} 应该可以工作。不过,看看你的骆驼代码会有所帮助。

编辑 1:

这对我有用。我是 运行 Camel 3.2.0 和 Spring Boot 2.2.6。我的类路径中的文件 myProperties.properties 中有一个 属性 prop=Hello World。我不必定义 PropertySourcesPlaceholderConfigurerSpringCamelContext beans

@SpringBootApplication
@PropertySource(ignoreResourceNotFound = false, value = {"classpath:myProperties.properties"})
public class DemoApplication extends RouteBuilder{

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void configure() throws Exception {
        from("timer:foo?repeatCount=1")
        .log("{{prop}}");
    }
}

日志

2020-04-28 21:26:57.904  INFO 10392 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Route: route6 started and consuming from: timer://foo
2020-04-28 21:26:57.921  INFO 10392 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Total 1 routes, of which 1 are started
2020-04-28 21:26:57.937  INFO 10392 --- [  restartedMain] o.a.c.impl.engine.AbstractCamelContext   : Apache Camel 3.2.0 (CamelContext: camel-6) started in 0.067 seconds
2020-04-28 21:26:57.938  INFO 10392 --- [  restartedMain] c.p.testproperties.DemoApplication       : Started DemoApplication in 0.406 seconds (JVM running for 82.808)
2020-04-28 21:26:57.955  INFO 10392 --- [  restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged
2020-04-28 21:26:58.920  INFO 10392 --- [4 - timer://foo] route6                                   : Hello World

编辑 2:

您可能正在从 Exchange 获取您的 属性,这可能会导致此问题。从 Camel 版本 3.0.0 开始,从交易所获取属性已经改变。你能试试exchangeProperty("xxx")