在OSGi包之间共享对象

时间:2012-08-23 12:15:57

标签: java spring jetty osgi apache-karaf

我在OSGi部署了两个Apache Karaf个捆绑包。 AB。我的A OSGi捆绑包用作基本身份验证处理程序。我已经设置了我的安全处理程序,它工作正常:

<bean id="securityHandler" class="org.eclipse.jetty.security.ConstraintSecurityHandler">
    <property name="authenticator">
        <bean class="org.eclipse.jetty.security.authentication.BasicAuthenticator"/>
    </property>
    <property name="constraintMappings">
        <list>
            <ref bean="constraintMapping"/>
        </list>
    </property>
    <property name="loginService" ref="loginService"/>
    <property name="strict" value="false"/>
    <property name="identityService" ref="identityService"/>
</bean>

此处理程序位于包A中。我需要做的是将此处理程序作为OSGi服务,供其他bundle使用,在本例中为bundle B。我无法实现ConstraintSecurityHandler类的任何接口,因为它来自org.eclipse.jetty.security包。

我尝试创建自己的Handler类,然后扩展ConstraintSecurityHandler并实现我的界面。所以OSGi服务看起来像这样:

<osgi:service ref="securityHandler" interface="my.company.MyInterface"  />

这不起作用,我得到例外:

org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route1: Route[[From[jetty:http://0.0.0.0:8019/TARGETjobs/Indeed?hand... because of Failed to resolve endpoint: jetty://http://0.0.0.0:8019/TARGETjobs/Indeed?handlers=securityHandler&matchOnUriPrefix=true due to: null

所以问题是如何将此securityHandler bean作为OSGi服务提供给其他OSGi个捆绑包?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。我创建的A捆绑包:

public class BasicAuthSecurityHandler implements Handler {

    private ConstraintSecurityHandler securityHandler;

    @Override
    public ConstraintSecurityHandler getSecurityHandler() {
        return securityHandler;
    }

    public void setSecurityHandler(ConstraintSecurityHandler securityHandler) {
        this.securityHandler = securityHandler;
    }        

}

接口:

public interface Handler {

    ConstraintSecurityHandler getSecurityHandler();

}

在我的A bundle Spring上下文中,我将安全处理程序设置为此bean并从此bean发出OSGi服务:

<bean id="basicAuthSecurityHandler" class="com.groupgti.handler.authentication.basic.BasicAuthSecurityHandler">
    <property name="securityHandler" ref="securityHandler"/>
</bean>

<osgi:service ref="basicAuthSecurityHandler" interface="com.groupgti.handler.authentication.basic.Handler"/>

现在在我的软件包B中,我可以轻松地检索我的安全处理程序:

<osgi:reference id="basicAuthSecurityHandler" interface="com.groupgti.handler.authentication.basic.Handler"/>
<bean id="securityHandler" factory-bean="basicAuthSecurityHandler" factory-method="getSecurityHandler"/>

一切正常。