2016-12-08 8 views
2

В моем приложении у меня есть 2 пакета. Оба используют cxf для создания Restful server. В этих пучках я загружаю cxf по чертежу. Я определяю cxf: bus в этих пакетах с тем же идентификатором, чтобы ожидать, что два пакета будут совместно использовать один и тот же экземпляр шины, после чего я смогу настроить перехватчик аутентификации на одном комплекте, и он будет применяться и к другому пакету. Они выглядят ниже.Как разделить cxf: автобус через несколько пакетов osgi на karaf?

Пачка 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> 

Пачка 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> 

После установки и запуска: Результат: все запросы на отдых для «/ cxf/rest1 /» будут запущены в authInterceptor, тогда как все запросы на остатки «cxf/rest2» - нет.

Может ли кто-нибудь дать мне несколько советов о том, как разделить один и тот же cxf: bus на обоих пучках? Спасибо заранее.

+0

Возможно, вы можете определить шину в другом комплекте, экспортировать ее как услугу, а затем импортировать шину в качестве службы OSGi. –

ответ

1

Поскольку я не могу решить эту проблему с помощью чертежа, я изменил способ его исправления. Вместо проекта я инициировал CXF Bus Rest Server с активатором.

Bundle 1 Активатор: В пачке 1, я получаю автобус по умолчанию и добавить аутентификации перехватчик на нем затем зарегистрировать конечную точку Rest сервера на нем.

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(); 
} 

В пачке 2 Bundle 2 Активатор Я получаю шины по умолчанию, зарегистрироваться и установить эту шину для отдыха Server.

@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(); 
} 

==> Результат: оба расслоения теперь используют один и тот же автобус, и расслоение 2 может работать в аутентификации перехватчик, который я зарегистрирован на пачке 1 тоже. !!!