2007-10-03

SpringとApache CXFで簡単に Webサービスを作る

Rails + ActionWebServiceほどではないが、Javaでも Apache CXFを使ってそこそこ簡単に Webサービスを作って公開することが出来る。

ここでは、ActionWebServiceの例で作ったのと同じ Hello Webサービスを実装してみる。

HelloService.java

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloService {
String sayHello(@WebParam(name="name") String name);
}

HelloServiceImpl.java

import javax.jws.WebService;

@WebService(endpointInterface = "com.acme.HelloService")
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
return "Hello, " + name;
}
}

Webサービスのインターフェイスには @WebServiceアノテーションをつけ、各メソッドの引数に名前が必要な場合は @WebParamアノテーションをつける。

Webサービスの実装クラスにも @WebServiceアノテーションをつけるが、こちらでは endpointInterface属性で自身を Webサービスとして公開するためのインターフェイスを明示する。

CXFServletを使って、このサービスを HTTPで利用可能な Webサービスとして公開することができる。さらに Springを組み合わせて使うことが有用なため、ここでは Springとのインテグレーションを前提に例を示す。

クラスパスに追加するもの
cxf-2.0.2-incubator.jar
geronimo-ws-metadata_2.0_spec-1.1.1.jar
geronimo-annotation_1.0_spec-1.1.jar
geronimo-activation_1.1_spec-1.0-M1.jar
jaxb-api-2.0.jar
jaxb-impl-2.0.5.jar
jaxws-api-2.0.jar
jdom-1.0.jar
wsdl4j-1.6.1.jar
XmlSchema-1.2.jar
xml-resolver-1.2.jar
stax-api-1.0.1.jar
wstx-asl-3.2.1.jar
saaj-api-1.3.jar
saaj-impl-1.3.jar
そのほか、springを使うのに必要なjarファイル群。

web.xmlに CXFServletを登録する。

<web-app>
<!--
SpringをWebアプリケーションで使うときにいつも必要なもの
-->

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<!--
Apache CXFで Webサービスを公開するためのサーブレット
-->

<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<!--
url-patternで指定したパスの下に Webサービスの
エンドポイントがぶらさがる形になる
-->

<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>

Springの Bean定義ファイル WEB-INF/applicationContext.xml に必要な記述は下記のとおり。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws=
"http://cxf.apache.org/jaxws"
xsi:schemaLocation=
"
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd"
>

<!--
CXFのために必要ないくつかの設定
-->

<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<!--
CXFによって公開される Webサービスを生成するファクトリBeanを
定義する。
この例は、Aegisバインディングを使用するための設定
-->

<bean id="serviceFactory"
class=
"org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
<property name="dataBinding">
<bean class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
</property>
<property name="serviceConfigurations">
<list>
<bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/>
<bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/>
<bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/>
</list>
</property>
</bean>

<!--
Helloサービスのインスタンス
ここではPOJOと同様の扱い
-->

<bean id="helloService" class="com.acme.HelloServiceImpl"/>

<!--
Helloサービスのエンドポイントを定義
implementorにはクラスの完全修飾名を指定するか、
#に続けて Springの Bean IDを指定する。
addressは エンドポイントのURIとなる
-->

<jaxws:endpoint id="helloWebService" implementor="#helloService"
address=
"/Hello">
<jaxws:serviceFactory>
<ref bean="serviceFactory"/>
</jaxws:serviceFactory>
</jaxws:endpoint>

</beans>


上記のように構成した Webアプリケーションをデプロイすると、http://myhost:port/services/Hello をエンドポイントとする Hello Webサービスが呼び出し可能になる。このサービスの WSDLは /services/Hello?wsdl で 取得できる。

0 件のコメント:

コメントを投稿

<< ホーム