CXFフレームワーク入門例


CXFはapache傘下のオープンソースフレームワークで、Celtix+XFireという2つの古典的なフレームワークから合成され、非常に流行しているwebサービスフレームワークです.
JAX-WSの全面的なサポートを提供し、実際のプロジェクトの必要に応じてコード優先(Code First)またはWSDL優先(WSDL First)を採用してWeb Servicesのリリースと使用を簡単に実現し、springと完璧に結合することができます.
apache cxfの公式サイトでcxfの比較的に全面的な助けのドキュメントを提供して、英語の教える子供靴はこの住所まで学ぶことができます:http://cxf.apache.org/docs/index.html
 
以下、公式サイトのチュートリアルを例に、cxfの使用を簡単に紹介します.
 
1、依存jarパッケージ
公式サイトに行ってcxf圧縮ファイルをダウンロードします:http://cxf.apache.org/download.html
解凍後、apache-cxf-2.4.1libディレクトリのjarパッケージをjavaプロジェクトに参照します.
 
2、JAX-WS簡単な例
まずwsインタフェースを作成します.
@WebService
public interface HelloService {
	public String sayHi(String text);
	public String getUser(User user);
	public List<User> getListUser();
}

 
Webserviceであることを示す「WebService」注記をインタフェースヘッダに明記する必要があります.
Userクラスについては、シーケンス化されたjavabeanです(オブジェクト転送プロセスでは、できるだけシーケンス化することをお勧めします.java ioに詳しい方は、この点を理解しておく必要があります):
public class User implements Serializable{
	private static final long serialVersionUID = 1001881900957402607L;
	
	private Integer id;
	private String name;

   getter,setter...
}

 
次に、インタフェースの実装クラスを記述します.
@WebService(endpointInterface = "com.bless.ws.HelloService", serviceName = "HelloService",portName="HelloServicePort")
public class HelloServiceImpl implements HelloService {

	@Override
	public String sayHi(String text) {
		System.out.println("sayHi called...");
		return "Hi :" + text;
	}

	@Override
	public String getUser(User user) {
		System.out.println("sayUser called...");
		return "User:[id=" + user.getId() + "][name=" + user.getName() + "]";
	}

	@Override
	public List<User> getListUser() {
		System.out.println("getListUser called...");
		List<User> lst = new ArrayList<User>();
		lst.add(new User(2, "u2"));
		lst.add(new User(3, "u3"));
		lst.add(new User(4, "u4"));
		lst.add(new User(5, "u5"));
		lst.add(new User(6, "u6"));
		return lst;
	}

}

注記WebServiceには、次の3つの属性があります.
endpointInterfaceは、クラスが複数のインタフェースを継承できるため、どのインタフェースがwebserviceインタフェースであるかを指定する必要があります.
ServiceName:現在のWebサービスの別名を表します
portName:現在のWebサービスのポート名を示します
これらのプロパティが定義されるとwsdlで表示され、定義されていない場合、cxfはデフォルトの別名とポート名を構成します.
 
Webサービスを最後に導入するには、次の手順に従います.
public class Server {
	
	protected Server() throws Exception {
        // START SNIPPET: publish
        System.out.println("Starting Server");
        HelloServiceImpl implementor = new HelloServiceImpl();
        String address = "http://localhost:8111/helloWorld";
        Endpoint.publish(address, implementor);
        // END SNIPPET: publish
    }
	
	public static void main(String[] args) throws Exception {
		new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
	}
}

Webサービスはサーバに配備する必要があり、Endpoint.publishメソッドの導入では、jettyに導入されたと思いますが、具体的な神馬状況は、個人的な経験不足のため、ここではでたらめを言わないでください.main関数を実行することでサービスを開始できます.サービスが開始されたかどうかを確認すると、http://localhost:8111/helloWorld?wsdlにアクセスできます.正しいxml情報を表示できれば、サービスの開始に成功したことを示します.
 
最後にクライアント・プログラムがwebサービスを呼び出すと書きます.
public final class Client {

    private static final QName SERVICE_NAME 
        = new QName("http://ws.bless.com/", "HelloService");
    private static final QName PORT_NAME 
        = new QName("http://ws.bless.com/", "HelloServicePort");


    private Client() {
    } 

    public static void main(String args[]) throws Exception {
        Service service = Service.create(SERVICE_NAME);
        // Endpoint Address
        String endpointAddress = "http://localhost:8111/helloWorld";

        // Add a port to the Service
        service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
        
        HelloService hw = service.getPort(HelloService.class);
        System.out.println(hw.sayHi("World"));

        System.out.println(hw.getUser(new User(1, "kaka")));
        
        for(User user : hw.getListUser()){
        	System.out.println("List User [id:"+user.getId()+"][name:"+user.getName()+"]");
        }
    }

}

 
 
テスト:
まずserverを起動し、問題がなければクライアントを起動し、コンソールの効果を見ることができます.
 
 
3、CXFとspringの統合:
Springに詳しい方はspringのIOC管理対象が非常に強いことを知っておくべきで、cxfとspringの統合もこの目的から来ています.
<?xml version="1.0" encoding="UTF-8"?>
<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-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<jaxws:endpoint id="helloWorld" implementor="com.bless.ws.HelloServiceImpl" address="http://localhost:8080/webservice/helloService" />
	
	<jaxws:client id="helloClient" serviceClass="com.bless.ws.HelloService" address="http://localhost:8080/webservice/helloService" />
	
</beans>

 
Javaコードテスト(テスト時に前のステップで構成したbeans.xmlファイルをsrcルートの下に置く):
public class SpringTest {
	public static void main(String[] args) {
		// START SNIPPET: client
        ClassPathXmlApplicationContext context 
            = new ClassPathXmlApplicationContext("beans.xml");
        
        HelloService client = (HelloService)context.getBean("helloClient");

        String response = client.sayHi("Joe");
        System.out.println("Response: " + response);
        System.exit(0);
        // END SNIPPET: client
	}
}

 
 
Webプロジェクトの場合は、Webを構成する必要があります.xmlファイル:
 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>CxfDemo</display-name>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/beans.xml</param-value>
	</context-param>

	<!--Spring ApplicationContext    ,  -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Spring   Introspector       -->
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</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>/webservice/*</url-pattern>
	</servlet-mapping>

</web-app>