我在OSGi
部署了两个Apache Karaf
个捆绑包。 A
和B
。我的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
个捆绑包?
答案 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"/>
一切正常。