CXFフレームワーク入門例
8761 ワード
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であることを示す「WebService」注記をインタフェースヘッダに明記する必要があります.
Userクラスについては、シーケンス化されたjavabeanです(オブジェクト転送プロセスでは、できるだけシーケンス化することをお勧めします.java ioに詳しい方は、この点を理解しておく必要があります):
次に、インタフェースの実装クラスを記述します.
注記WebServiceには、次の3つの属性があります.
endpointInterfaceは、クラスが複数のインタフェースを継承できるため、どのインタフェースがwebserviceインタフェースであるかを指定する必要があります.
ServiceName:現在のWebサービスの別名を表します
portName:現在のWebサービスのポート名を示します
これらのプロパティが定義されるとwsdlで表示され、定義されていない場合、cxfはデフォルトの別名とポート名を構成します.
Webサービスを最後に導入するには、次の手順に従います.
Webサービスはサーバに配備する必要があり、Endpoint.publishメソッドの導入では、jettyに導入されたと思いますが、具体的な神馬状況は、個人的な経験不足のため、ここではでたらめを言わないでください.main関数を実行することでサービスを開始できます.サービスが開始されたかどうかを確認すると、http://localhost:8111/helloWorld?wsdlにアクセスできます.正しいxml情報を表示できれば、サービスの開始に成功したことを示します.
最後にクライアント・プログラムがwebサービスを呼び出すと書きます.
テスト:
まずserverを起動し、問題がなければクライアントを起動し、コンソールの効果を見ることができます.
3、CXFとspringの統合:
Springに詳しい方はspringのIOC管理対象が非常に強いことを知っておくべきで、cxfとspringの統合もこの目的から来ています.
Javaコードテスト(テスト時に前のステップで構成したbeans.xmlファイルをsrcルートの下に置く):
Webプロジェクトの場合は、Webを構成する必要があります.xmlファイル:
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>