2016-12-08 2 views
2

In meiner Anwendung habe ich 2 Bündel. Beide verwenden CXF, um Restful-Server zu erstellen. In diese Bündel lade ich Cxf über Blueprint. Ich definiere cxf: bus auf diesen Bündeln mit der gleichen ID zu erwarten, dass zwei Bündel die gleiche Businstanz teilen, dann kann ich einen Authentication Interceptor auf ein Bündel konfigurieren und es wird auch für das andere Bündel gelten. Sie sieht wie folgt aus.Wie teile ich cxf: bus über mehrere osgi-Bundles auf Karaf?

Bundle 1:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs" 
     xmlns:cxf="http://cxf.apache.org/blueprint/core" 
     xsi:schemaLocation=" 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
     http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd 
     http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd 
     "> 
<bean id="authInterceptor" class="com.dasannetworks.vn.rest.impl.AuthInterceptorImpl"></bean> 
<cxf:bus id="my-app-bus" name="tutorial"> 
    <cxf:inInterceptors> 
     <ref component-id="authInterceptor"/> 
    </cxf:inInterceptors> 
</cxf:bus> 


<bean id="Rest1ServiceImpl"class="com.dasannetworks.vn.rest.impl.Rest1ServiceImpl"></bean> 

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
    <property name="serializeAsArray" value="true"/> 
    <property name="dropRootElement" value="true"/> 
    <property name="supportUnwrapped" value="true"/> 
</bean> 

<jaxrs:server id="custom1Service" address="/rest1"> 
    <jaxrs:serviceBeans> 
     <ref component-id="rest1ServiceImpl"/> 
    </jaxrs:serviceBeans> 
    <jaxrs:providers> 
     <ref component-id="jsonProvider"/> 
    </jaxrs:providers> 
</jaxrs:server> 

Bundle 2:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:jaxrs="http://cxf.apache.org/blueprint/jaxrs" 
     xmlns:cxf="http://cxf.apache.org/blueprint/core" 
     xsi:schemaLocation=" 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd 
     http://cxf.apache.org/blueprint/jaxrs http://cxf.apache.org/schemas/blueprint/jaxrs.xsd 
     http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd 
     "> 

<cxf:bus id="my-app-bus" bus="tutorial"></cxf:bus> 
<bean id="rest2Service" class="com.dasannetworks.vn.rest2.impl.Rest2ServiceImpl" /> 
<jaxrs:server id="custom2Service" address="/rest2"> 
    <jaxrs:serviceBeans> 
     <ref component-id="rest2Service"/> 
    </jaxrs:serviceBeans> 

Nach der Installation und auszuführen: 012.Das Ergebnis: alle Pausen Anfrage an "/ CXF/Rest1 /" wird in AuthInterceptor laufen, während alle Pausen Anfrage an "CXF/Rest2" sind nicht.

Könnte jemand mir einen Rat geben, wie man den gleichen cxf: bus auf beiden Bündeln teilt? Vielen Dank im Voraus.

+0

Vielleicht können Sie den Bus in einem anderen Bundle definieren, als Dienst exportieren und dann den Bus als OSGi-Dienst importieren. –

Antwort

1

Da ich dieses Problem mit Blaupause nicht lösen kann, habe ich den Weg geändert, um es zu beheben. Anstatt Blueprint, initiierte ich CXF Bus Rest Server mit Activator.

Bundle 1 Activator: In Bündel 1, erhalte ich den Standard-Bus und Authentifizierung Abfangjäger hinzufügen auf es dann einen Rest hat Server-Endpunkt auf sie registrieren.

public void start(BundleContext bundleContext) throws Exception { 
    Bus defaultBus = BusFactory.getDefaultBus(); 
    defaultBus.setId("my-app-bus"); 
    BusFactory.clearDefaultBusForAnyThread(defaultBus); 
    System.out.println(this.getClass().getName()); 
    System.out.println(defaultBus.getId()); 
    defaultBus.getInInterceptors().clear(); 
    defaultBus.getInInterceptors().add(new AuthInterceptorImpl()); 

    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); 
    sf.setBus(defaultBus); 
    sf.setAddress("/tutorial"); 
    sf.setServiceClass(HelloRestServiceImpl.class); 
    sf.create(); 
} 

In Bündel 2, Bundle 2 Activator ich den Standard-Bus, registrieren und diesen Bus für Ruhe Server eingestellt.

@Override 
public void start(BundleContext bundleContext) throws Exception { 
    Bus defaultBus = BusFactory.getDefaultBus(); 
    List<Interceptor<? extends Message>> inInterceptors = defaultBus.getInInterceptors(); 
    for(Interceptor interceptor: inInterceptors) { 
     System.out.println(interceptor.getClass().getName()); 
    } 

    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); 
    sf.setBus(defaultBus); 
    sf.setAddress("/Rest2"); 
    sf.setServiceClass(Rest2ServiceImpl.class); 
    sf.create(); 
} 

==> Das Ergebnis: beide Bündel werden nun den gleichen Bus verwenden, und kann in 2 Bundle Authentifizierungs Interceptor laufen, die ich auf Bündel 1 ebenfalls registriert. !!!

Verwandte Themen