3

Axis2、Spring、Hibernate を使用しています。.aar file以下のコマンド で作成しました。

jar cvf someName.aar *  

私の.aarファイルは次のようになります。

 _ classFilesWithInPackage (E.g. com/test/.../fileName.java)  
|_ META-INF/(MANIFEST.MF and services.xml)  
|_ applicationContext.xml  
|_ lib/required jars  

そして私のservices.xml

<serviceGroup>
    <service name="SpringInitializationService" class="com.test.service.SpringInitService">
        <description>
            This web service initializes Spring.
        </description>
        <parameter name="ServiceClass">com.test.service.SpringInitService
        </parameter>
        <parameter name="ServiceTCCL">composite</parameter>
        <parameter name="load-on-startup">true</parameter>
    </service>
    <service name="TestService">
        <Description>
            Policy Web Service
        </Description>
        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </messageReceivers>
        <parameter name="ServiceClass" locked="false">com.test.service.TestService
        </parameter>
        <parameter name="ServiceObjectSupplier">
            org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
        </parameter>
        <parameter name="SpringBeanName">axis2SpringIntegrationService</parameter>
        <parameter name="SpringContextLocation">applicationContext.xml</parameter>
    </service>
</serviceGroup>  

インターフェイスを実装しServiceLifeCycle、次のメソッドもオーバーライドします。参考サイトhttp://fazlansabar.blogspot.com.es/2012/04/apache-axis2-tutorial-integrating-with.html .

public class SpringInitService implements ServiceLifeCycle {

    ClassLoader classLoader = null;
    ClassPathXmlApplicationContext appCtx = null;

    @Override
    public void shutDown(ConfigurationContext configContext, AxisService axisService) {
        appCtx = null;
        classLoader = null;     
    }

    @Override
    public void startUp(ConfigurationContext configContext, AxisService axisService) {

        System.out.println("Inside Spring Init");

        try {
            classLoader = axisService.getClassLoader();
            appCtx = new ClassPathXmlApplicationContext(new String[] {"classpath:**applicationContext.xml"}, false);
            appCtx.setClassLoader(classLoader);
            appCtx.refresh();
        } catch (Exception e) {
            e.printStackTrace();
        }       

        System.out.println("Out of Spring Init");
    }

}  

そこから.aarファイルを作成してデプロイすると、インターフェースを実装しているためWSO2 server、正常にデプロイされ、com.test.service.SpringInitService起動時にクラスもエラーなしで初期化されました。しかし、 (services.xmlの2番目のサービス)で ServiceLifeCycle利用可能なサービスを呼び出すと、エラーが発生しました。TestService

org.apache.axis2.AxisFault: Axis2 Can't find Spring's ApplicationContext  

誰かが私が間違っていることを教えてください。
また、明確にし、

Whether my .aar folder structure is right?
Can we have more than one service in services.xml as above?
What is the best way to have Axis2, Spring and Hibernate together?  

更新:
Axis2 サイトの以下のリファレンスに従ってみましたが、うまくいきませんでした。
http://axis.apache.org/axis2/java/core/docs/spring.html

どんな助けでも大歓迎です。前もって感謝します。

4

3 に答える 3

0

これを、services.xml の春の初期化サービスに追加してみてください。

<parameter name="ServiceObjectSupplier"
locked="false">org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier</parameter>
于 2014-02-20T14:09:30.830 に答える
0

次のコードを applicationContext.xml ファイルに追加するだけです。

 <bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />

Spring は自動的に applicationContext を ApplicationContextHolder に割り当てます。

于 2015-05-17T12:45:59.577 に答える
0

独自のApplicationContextHolderを実装する

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextHolder implements ApplicationContextAware {

    private static ApplicationContext appCtx;

    public ApplicationContextHolder() {}

    /** Spring supplied interface method for injecting app context. */
    public void setApplicationContext(ApplicationContext applicationContext)
        throws BeansException {
        appCtx = applicationContext;
    }

    /** Access to spring wired beans. */
    public static ApplicationContext getContext() {
        return appCtx;
    }

}

settings.xmlで使用します

<bean id="applicationContext"
class="org.ravinda.service.spring.ApplicationContextHolder" />
于 2017-06-06T13:41:40.283 に答える