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 を初期化するにはどうすればよいですか?
ご質問をお待ちしております。