5

Stackoverflow ユーザーの皆様、こんにちは。私は最近、Spring フレームワークを使用した axis2 Web サービスに関する 1 つの特定の問題に悩まされています。私はさまざまなガイドを読み、さまざまなフォーラムを読みましたが、同じ問題を抱えていても解決策がない人を見つけました. 結局、モニターを両手で持って「ブダペストハッカー938って何を知ったの?」と大声で叫びました。とにかく、私の axis2 Web サービス クラスには Spring Bean が必要なため、Web サービス クラス内で自動配線されます。私がservletContextを持っているjettyサーバー内では、すべてがうまく機能します。必要なリスナーを web.xml で定義するだけで機能します。そのような至福。しかし、残念なことに、すべての良いことはある時点で終わりを迎えます。私にとって、悪魔はメインフレーム内の CICS 環境です。Jetty/Tomcat のような servletcontext はありません。幸いなことに、今でも axis2 をサポートしています。そこで、さまざまなユーザー ガイドに従って、Web サービスを .aar にアーカイブし、services フォルダーの下に追加することにしました。Axis2 フォルダー構造は次のとおりです。

  • リポジトリ/
    • モジュール
    • サービス

この .aar アーカイブを構築しているときに、services.xml に従って指定されたクラスからサービスを生成する axis2 組み込みの wsdl ジェネレーターを使用せずに、独自の wsdl も生成しています (axis2server を実行しているときは、使用していないため、使用していません)。私が知る限り、JAX-WS アノテーションは好きではありません)。Spring フレームワークを初期化するには、Spring Bean を初期化する小さな SpringInit クラスを作成する必要がありました。残念ながら、何らかの理由で、注釈に従って Web サービス クラスを初期化し、メイン ポートを占有します (Spring Bean としても定義されており、SpringInit が Axis2 クラスの ServiceLifeCycle を拡張しているため、SpringInit が Web サービス クラスを独自に初期化すると思われます)。アドレスが既に使用されていることを示すJVM BIND例外が発生します。さまざまな環境があるため、新しいサービスを生成するのではなく、WSDL の内部に格納されている wsdl に従ってサービスを構築したいと考えています: 1) ローカル マシン - Jetty 2) メインフレーム。とにかく、私は自分のservices.xmlに洞察を与えます:

<service name="Absence" class="org.services.SpringInit">
<description>
    random description
</description>
<parameter name="ServiceTCCL">composite</parameter>
<parameter name="useOriginalwsdl" locked="false">true</parameter>
<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier</parameter>
<parameter name="ServiceClass">org.services.Absence</parameter>
<parameter name="SpringBeanName">absence</parameter>
<parameter name="SpringContextLocation">META-INF/applicationContextAar.xml</parameter>
</service>

Spring applicationContextAar.xml は、親愛なる Stack コミュニティ向けに少しリファクタリングされています。

<beans>
<bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:tcp://localhost/~/devDb" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="absence" class="org.services.Absence"></bean>
<bean id="jtemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="ds"></constructor-arg>
</bean>
<bean id="datasetFactory" class="org.vsam.DataSetFactory"></bean>
<bean id="dataManagerFactory" class="org.datamanager.DataManagerFactory"></bean>
<bean id="absenceFactory" class="org.services.AbsenceFactory"></bean>
<bean id="h2Database" class="org.dataset.H2Database"><constructor-arg ref="jtemplate"></constructor-arg>
</bean>
<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"></bean>
</beans>

私の SpringInit クラスは次のようになります。

public class SpringInit implements ServiceLifeCycle {

public void startUp(ConfigurationContext ignore, AxisService service) {

    try {
        ClassLoader classLoader = service.getClassLoader();
        ClassPathXmlApplicationContext appCtx = new
        ClassPathXmlApplicationContext(new String[] {"applicationContextAar.xml"}, false);
            appCtx.setClassLoader(classLoader);
            appCtx.refresh();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void shutDown(ConfigurationContext ctxIgnore, AxisService ignore) {}
}

次に、org.services.Absence.class に移動します。これは、次のヘッダー (JAX-WS アノテーションを含む) を持つ通常の JAX-WS Web サービス クラスです。

@WebService(name = "AbsenceService", serviceName = "Absence", portName = "Absence",
targetNamespace = "http://www.something.org/Absence")
public class Absence extends ServiceHandlerBase { 

    @Autowired
private AbsenceFactory absenceFactory;

@Autowired
private DataManagerFactory dataManagerFactory;

@Autowired
private DataSetFactory dataSetFactory;


... 

}

そのようなメソッドを含む:

@WebMethod
@WebResult(name = "AbsenceResponse")
public SearchAbsenceRecordsResponse invokeSearchAbsenceRecords(
        @WebParam ServiceRequest request,
        @WebParam SearchAbsenceRecordsRequest absenceRequest) {...}

1 つの代替方法は、「servicejars」フォルダーを「repository」フォルダーに追加し、サブフォルダー「lib」にすべての依存関係を持つ不在.jar を移入することです。Axis2 には JAX-WS アノテーションがあるため、absense.jar が自動的に実行されます。しかし、たとえばSOAP-UIを使用してWebサービスを呼び出すと、そのソリューションでSpringを初期化する方法がわからないため、Springが初期化されていません。多分誰かがそれについての専門知識を持っています。

TL;DR

アノテーションに従って Web サービス クラスでサービスを開始せず、wsdl に従ってサービスを構築するように、Spring Bean を初期化するにはどうすればよいですか?

ご質問をお待ちしております。

4

1 に答える 1