从外部包创建蓝图中的bean

时间:2017-11-14 11:49:08

标签: apache-camel bundle osgi-bundle karaf blueprint-osgi

我在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接口。

如果我将类移动到同一个捆绑包它正在工作,但我需要将它放在一个单独的捆绑中,原因我之前解释过。

有人能告诉我哪里错了吗?

非常感谢!

1 个答案:

答案 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>