我正在尝试创建一个 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
既然您使用的是 spring boot,那么 spring boot AutoConfiguration 是否可行?如果你可以:
由于 camel spring boot 将 org.springframework.ldap.core.support.LdapContextSource 的创建委托给 spring boot 本身执行了额外的检查,因此错误
必须至少设置一个服务器url
我希望这个解决方案对你有用,同时,我们将回顾如何从 yaml 创建 beans,以便 karavan 和 yaml dsl 可以在所有运行时提供相同的体验。