如何在 Apache Camel 中创建 YAML DSL 路由以查询 LDAP 属性?

问题描述 投票:0回答:1

我正在尝试创建一个 YAML 路由来对 LDAP 服务器执行简单查询并将结果输出到日志。我的路线如下所示:

- route:
    id: route-561c
    from:
      uri: timer:1000
      id: from-c523
      parameters:
        repeatCount: 1
      steps:
        - setBody:
            id: setBody-1772
            expression:
              simple:
                expression: '{"filter":"(sn=Amanda)"}'
                id: simple-12b7
                resultType: String
        - unmarshal:
            id: unmarshal-7216
            json:
              id: json-91b8
              library: Jackson
        - log:
            message: ${body[filter]}
            id: log-eab5
        - to:
            uri: spring-ldap:ldapTemplate
            id: to-60b7
            parameters:
              operation: SEARCH
        - log:
            message: ${body}
            id: log-18a8
            logName: logLdapResponse
- beans:
    - name: ldapContextSource
      properties:
        url: ldap://localhost:389
        base: ou=Users,dc=example,dc=org
        userDn: cn=admin,dc=example,dc=org
        password: admin
      type: org.springframework.ldap.core.support.LdapContextSource
    - name: ldapTemplate
      type: org.springframework.ldap.core.LdapTemplate

运行路线时,我收到以下错误:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-04-21T12:24:23.642+02:00 ERROR 26712 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.apache.camel.spring.boot.CamelSpringBootInitializationException: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ldap.core.support.LdapContextSource': **At least one server url must be set**
    at org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:212) ~[camel-spring-boot-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:58) ~[camel-spring-boot-4.0.0-M1.jar:4.0.0-M1]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:413) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:370) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:937) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:587) ~[spring-context-6.0.8.jar:6.0.8]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-3.0.6.jar:3.0.6]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-3.0.6.jar:3.0.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[spring-boot-3.0.6.jar:3.0.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.6.jar:3.0.6]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.6.jar:3.0.6]
    at net.konzult.camel.ldappoc.LdapPocApplication.main(LdapPocApplication.java:10) ~[classes/:na]
Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ldap.core.support.LdapContextSource': At least one server url must be set
    at org.apache.camel.dsl.yaml.deserializers.BeansDeserializer$1.configure(BeansDeserializer.java:70) ~[camel-yaml-dsl-deserializers-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.dsl.yaml.common.YamlSupport$1.configure(YamlSupport.java:121) ~[camel-yaml-dsl-common-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.dsl.yaml.YamlRoutesBuilderLoader$1.doConfigure(YamlRoutesBuilderLoader.java:174) ~[camel-yaml-dsl-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.dsl.yaml.YamlRoutesBuilderLoader$1.configure(YamlRoutesBuilderLoader.java:148) ~[camel-yaml-dsl-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.builder.RouteBuilder.checkInitialized(RouteBuilder.java:724) ~[camel-core-model-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.builder.RouteBuilder.configureRoutes(RouteBuilder.java:666) ~[camel-core-model-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:598) ~[camel-core-model-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.impl.engine.AbstractCamelContext.addRoutes(AbstractCamelContext.java:1201) ~[camel-base-engine-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.main.RoutesConfigurer.addDiscoveredRoutes(RoutesConfigurer.java:237) ~[camel-main-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.main.RoutesConfigurer.configureRoutes(RoutesConfigurer.java:212) ~[camel-main-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:106) ~[camel-spring-boot-4.0.0-M1.jar:4.0.0-M1]
    ... 14 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ldap.core.support.LdapContextSource': At least one server url must be set
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1770) ~[spring-beans-6.0.8.jar:6.0.8]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:598) ~[spring-beans-6.0.8.jar:6.0.8]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:520) ~[spring-beans-6.0.8.jar:6.0.8]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:365) ~[spring-beans-6.0.8.jar:6.0.8]
    at org.apache.camel.spring.spi.SpringInjector.newInstance(SpringInjector.java:64) ~[camel-spring-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.spring.spi.SpringInjector.newInstance(SpringInjector.java:41) ~[camel-spring-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.support.PropertyBindingSupport.resolveBean(PropertyBindingSupport.java:1545) ~[camel-support-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.dsl.yaml.deserializers.NamedBeanDefinition.newInstance(NamedBeanDefinition.java:64) ~[camel-yaml-dsl-deserializers-4.0.0-M1.jar:4.0.0-M1]
    at org.apache.camel.dsl.yaml.deserializers.BeansDeserializer$1.configure(BeansDeserializer.java:68) ~[camel-yaml-dsl-deserializers-4.0.0-M1.jar:4.0.0-M1]
    ... 24 common frames omitted
Caused by: java.lang.IllegalArgumentException: At least one server url must be set
    at org.springframework.ldap.core.support.AbstractContextSource.afterPropertiesSet(AbstractContextSource.java:417) ~[spring-ldap-core-3.0.2.jar:3.0.2]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1816) ~[spring-beans-6.0.8.jar:6.0.8]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766) ~[spring-beans-6.0.8.jar:6.0.8]
    ... 32 common frames omitted

我明白问题出在

At least one server url must be set
部分。但是这个 bean 有一个包含 url 的属性。

整个项目可以在https://github.com/jirmed/ldap-poc上找到 .演示 OpenLdap 服务器可以在 Docker 中使用子文件夹中的

docker compose up
启动
ldap

apache-camel spring-ldap
1个回答
0
投票

既然您使用的是 spring boot,那么 spring boot AutoConfiguration 是否可行?如果你可以:

  • 将 org.apache.camel.springboot:camel-spring-ldap-starter 依赖项添加到您的 pom
  • 删除yaml路由中的bean配置
  • Add spring.ldap.* properties in application.properties (urls, base, embedded.base-dn, password, username...) 为了自动配置 ldapTemplate bean

由于 camel spring boot 将 org.springframework.ldap.core.support.LdapContextSource 的创建委托给 spring boot 本身执行了额外的检查,因此错误

必须至少设置一个服务器url

我希望这个解决方案对你有用,同时,我们将回顾如何从 yaml 创建 beans,以便 karavan 和 yaml dsl 可以在所有运行时提供相同的体验。

© www.soinside.com 2019 - 2024. All rights reserved.