我在Karaf中使用带有蓝图xml的Camel,我想创建一个来自不同包的类的bean。
<blueprint>
...
<bean id="token-validation" class="com.xxx.security.JwtTokenValidator" init-method="init" >
<property name="realm" value="${auth.realm}"/>
</bean>
...
<camelContext>
<route id="route.EventsNotify" routePolicyRef="token-validation">
...
</camelContext>
</blueprint>
JwtTokenValidator 类位于另一个包中,它扩展了Camel的RoutePolicySupport,这就是它在路由route.EventsNotify中应用的原因。
public class JwtTokenValidator extends RoutePolicySupport {
@Override
public void onExchangeBegin(Route route, Exchange exchange) {
super.onExchangeBegin(route, exchange);
checkAuthorizationHeader(exchange);
}
...
}
此捆绑包具有一些依赖项和类,如上所述,以便在许多项目中使用。写一次并应用于许多项目,而不是一次又一次地处理相同的代码。
不幸的是,这不起作用,我在stacktrace中收到以下错误
Caused by: java.lang.ClassCastException: Cannot cast com.xxx.security.JwtTokenValidator to org.apache.camel.spi.RoutePolicy
我无法理解为什么,因为该类正在扩展RoutePolicySupport,它实现了所需的RoutePolicy接口。
如果我将类移动到同一个捆绑包它正在工作,但我需要将它放在一个单独的捆绑中,原因我之前解释过。
有人能告诉我哪里错了吗?
非常感谢!
答案 0 :(得分:0)
尝试将所有必需的类(org.apache.camel.spi.RoutePolicy,...)导入当前的Bundle的classLoader。如果您使用maven-bundle插件构建捆绑包,则可以这样做:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
...
<configuration>
<instructions>
...
<Import-Package>
...,
org.apache.camel.spi*;version=[min_version, max_version),
...
</Import-Package>
</instructions>
</configuration>
</plugin>