SpringとApache CXFで簡単に Webサービスを作る
Rails + ActionWebServiceほどではないが、Javaでも Apache CXFを使ってそこそこ簡単に Webサービスを作って公開することが出来る。
ここでは、ActionWebServiceの例で作ったのと同じ Hello Webサービスを実装してみる。
HelloService.java
HelloServiceImpl.java
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を登録する。
Springの Bean定義ファイル WEB-INF/applicationContext.xml に必要な記述は下記のとおり。
上記のように構成した Webアプリケーションをデプロイすると、http://myhost:port/services/Hello をエンドポイントとする Hello Webサービスが呼び出し可能になる。このサービスの WSDLは /services/Hello?wsdl で 取得できる。
ここでは、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 件のコメント:
コメントを投稿
<< ホーム