Apache CXF で JAX-WS な Web サービスを作ってみる

Apache CXF で JAX-WS な Web サービスを作ってみたのでメモしておきます。

といっても、以下を参考にほぼコピペしただけの内容です。完全なる備忘録・・・

Apache CXF -- Writing a service with Spring
http://cxf.apache.org/docs/writing-a-service-with-spring.html

・Spring、Apache CXF を使用した POJO Web サービスの設計と実装: 第 1 回 CXF と Spring を使った Web サービス作成の概要
http://www.ibm.com/developerworks/jp/webservices/library/ws-pojo-springcxf/

まぁ、今後ちゃんと調べるとして、ひとまず順にいきます。

1. pom.xml の作成


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>cxf-app</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <build>
    <plugins>
        <plugin>
        	<groupId>org.apache.maven.plugins</groupId>
        	<artifactId>maven-compiler-plugin</artifactId>
        	<version>3.1</version>
        	<configuration>
            	<source>1.8</source>
            	<target>1.8</target>
        	</configuration>
    	</plugin>
    </plugins>
  </build>
  
	<properties>
  		<cxf.version>3.0.4</cxf.version>
  		<spring.version>3.1.3.RELEASE</spring.version>
	</properties>
 
	<dependencies>
    	<dependency>
        	<groupId>org.apache.cxf</groupId>
        	<artifactId>cxf-rt-frontend-jaxws</artifactId>
        	<version>${cxf.version}</version>
    	</dependency>
    	<dependency>
        	<groupId>org.apache.cxf</groupId>
        	<artifactId>cxf-rt-transports-http</artifactId>
        	<version>${cxf.version}</version>
    	</dependency>
		<dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-web</artifactId>
    		<version>${spring.version}</version>
    	</dependency>
	</dependencies>
</project>


2. サービスクラスの作成


package com.example;

import javax.jws.WebService;

@WebService
public interface Hello {
	public String hello();
}
package com.example;

import javax.jws.WebService;

@WebService(endpointInterface = "com.example.Hello")
public class HelloImpl implements Hello {

	@Override
	public String hello() {
		return "hello !!";
	}

}


3. bean 定義ファイルの作成


<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">
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
    <jaxws:endpoint id="helloWorld" implementor="com.example.HelloImpl" address="/Hello"/>
</beans>


4. web.xml の作成


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>cxf-app</display-name>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>WEB-INF/beans.xml</param-value>
   </context-param>
 
   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>
   
  <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>/*</url-pattern>
 </servlet-mapping>
</web-app>

※ しかし、なんで CXF のドキュメントには CXFServlet を設定することが書いてないんだ・・・

以上でサービス側の作成は完了です。以降はクライアント側の内容になります。


5. クライアントクラスの作成


package com.example.client;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.Hello;

public final class Client {

	private Client() {
	}

	public static void main(String args[]) throws Exception {
		// START SNIPPET: client
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "client-beans.xml" });

		Hello client = (Hello) context.getBean("helloClient");

		String response = client.hello();
		System.out.println("Response: " + response);
		System.exit(0);
	}
}


6. クライアント側の bean 定義ファイルの作成


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
 
    <jaxws:client id="helloClient"
                  serviceClass="com.example.Hello"
                  address="http://localhost:8080/cxf-app/Hello" />
</beans>

上記完了後、Client.java を実行すると「Response: hello !!」と表示されるはずです。

以上です。

[ 環境情報 ]
Apache CXF 3.0.4
Spring 3.1.3.RELEASE
Java SE 8 Update 25
Apache Tomcat 8.0.21
EclipseMaven Project を使用しております。