Karaf 4.4部署Camel Blueprint项目时出现javax.el依赖错误
问题描述
我有一个基于Camel 2.23、Java 8的Blueprint项目,部署到Karaf 4.4时遇到javax.el相关的依赖错误,具体错误信息如下:
Camel Blueprint Camel context "BaseRestContext" Exception: Failed to create route SYNC-RESPONSE: Route(SYNC-RESPONSE)[[From[direct-vm:SyncResponse]] -> [OnEx... because of Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead org.apache.camel.FailedToCreateRouteException: Failed to create route SYNC-RESPONSE: Route(SYNC-RESPONSE)[[From[direct-vm:SyncResponse]] -> [OnEx... because of Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead at org.apache.camel.impl.RouteService.warmUp(RouteService.java:147) at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3953) at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3860) at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3646) at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3489) at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3248) at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3244) at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3267) at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3244) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72) at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3160) at org.apache.camel.blueprint.BlueprintCamelContext.start(BlueprintCamelContext.java:255) at org.apache.camel.blueprint.BlueprintCamelContext.maybeStart(BlueprintCamelContext.java:297) at org.apache.camel.blueprint.BlueprintCamelContext.blueprintEvent(BlueprintCamelContext.java:188) at org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:197) at org.apache.aries.blueprint.container.BlueprintEventDispatcher$3.call(BlueprintEventDispatcher.java:195) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: bean-validator://beanValidation. Reason: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:584) at org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:168) at org.apache.camel.processor.SendProcessor.doStart(SendProcessor.java:248) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:160) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:62) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90) at org.apache.camel.processor.MulticastProcessor.doStart(MulticastProcessor.java:1185) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90) at org.apache.camel.processor.TryProcessor.doStart(TryProcessor.java:163) at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:160) at org.apache.camel.support.ServiceSupport.start(ServiceHelper.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:60) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:104) at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:90) at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:80) at org.apache.camel.support.ServiceSupport.start(ServiceHelper.java:72) at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:75) at org.apache.camel.impl.RouteService.startChildService(RouteService.java:370) at org.apache.camel.impl.RouteService.doWarmUp(RouteService.java:196) at org.apache.camel.impl.RouteService.warmUp(RouteService.java:145) ... 24 more Caused by: javax.validation.ValidationException: HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.buildExpressionFactory(ResourceBundleMessageInterpolator.java:123) at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.<init>(ResourceBundleMessageInterpolator.java:46) at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolator(ConfigurationImpl.java:474) at org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultMessageInterpolatorConfiguredWithClassLoader(ConfigurationImpl.java:650) at org.hibernate.validator.internal.engine.ConfigurationImpl.getMessageInterpolator(ConfigurationImpl.java:397) at org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:183) at org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:38) at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:364) at org.apache.camel.component.bean.validator.ValidatorFactories.buildValidatorFactory(ValidatorFactories.java:63) at org.apache.camel.component.bean.validator.BeanValidatorEndpoint.createProducer(BeanValidatorEndpoint.java:69) at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:573) ... 63 more
我尝试在项目的pom文件中添加以下依赖,但问题仍未解决:
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.1-b06</version> </dependency>--> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b09</version> </dependency>
我也曾替换这些依赖,只使用最新版本,但问题依旧存在:
<dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.el</artifactId> <version>3.0.3</version> <!--<scope>compile</scope> <type>jar</type> --> </dependency>
解决方法
- Karaf环境下安装EL特性包
Karaf 4.4的OSGi类加载机制导致直接在pom中添加依赖无法生效,需要明确安装EL相关特性。执行以下Karaf命令:
feature:install el-3.0
若偏好JBoss的EL实现,可执行:
feature:install jboss-el-3.0
- 调整依赖Scope与包导入配置
将pom中的EL依赖scope设为provided,避免打包时与Karaf容器的依赖冲突:
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.1-b06</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> <version>3.0.1-b09</version> <scope>provided</scope> </dependency>
同时在maven-bundle-plugin中配置导入javax.el包:
<plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Import-Package> javax.el.*, * </Import-Package> </instructions> </configuration> </plugin>
- 配置Bean Validator使用ParameterMessageInterpolator
如果不想依赖EL环境,可直接修改Camel的Bean Validator配置,跳过EL工厂初始化:
在Blueprint XML中定义自定义ValidatorFactory和BeanValidator组件:
<bean id="validatorFactory" class="org.hibernate.validator.HibernateValidator" factory-method="buildValidatorFactory"> <constructor-arg> <bean class="org.hibernate.validator.internal.engine.ConfigurationImpl"> <method name="messageInterpolator"> <argument> <bean class="org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator"/> </argument> </method> </bean> </constructor-arg> </bean> <bean id="beanValidator" class="org.apache.camel.component.bean.validator.BeanValidatorComponent"> <property name="validatorFactory" ref="validatorFactory"/> </bean>
路由中使用该自定义组件:
<route id="SYNC-RESPONSE"> <from uri="direct-vm:SyncResponse"/> <to uri="beanValidator://beanValidation"/> <!-- 其他路由逻辑 --> </route>
- 检查版本兼容性
Camel 2.23默认依赖Hibernate Validator 5.4.x版本,需确保EL依赖版本与之匹配,避免使用过高版本的EL包导致兼容性问题。
内容的提问来源于stack exchange,提问作者David Florez Mendez
相关产品推荐
相关产品推荐

