【WebService開発】CXFによるWebService開発

15170 ワード

1.開発サービス
a)CXF:apache-cxf-3.1.をダウンロードする6
b)cxfのjarパッケージをプロジェクトに追加し、その他変更する必要はなく(JDKがwebserviceを開発するのと同じ)、webserviceサービス側の開発が完了した.
2.クライアントの開発
a)環境変数pathに加え、E:apache-cxf-3.1.6\bin
b)cmdコマンドの下でクライアントコードを生成し、コマンドはwsdl 2 java urlであり、このコマンドはcxfのbinディレクトリの下の機能である.
c)クライアントテストコードの作成
public class ClientTest {
	public static void main(String[] args) {
		HelloWSImplService factory = new HelloWSImplService();
		HelloWs helloWs = factory.getHelloWSImplPort();
		String result = helloWs.sayHello("xdy");
		System.out.println(result);
	}
}

WebServiceリクエストの流れ
Webサービスリクエストの本質:
1.クライアントは、サービス側にsoapメッセージ(http要求+xml断片)を送信する.
2.サーバ側は要求を処理した後、クライアントにsoapメッセージを返す.
/*********************************************************************************************/
CXFフレームワークの使用
1、CXFの遮断器
なぜブロッキングを設計したのですか?
Webserviceリクエスト中にリクエストと応答データを動的に操作できるように、CXFはブロッキングを設計した.
ブロッキング区分:
1.位置によって分けます:サーバー側ブロック、クライアントブロック.
2.メッセージの方向に分けます:インターセプタに入って、インターセプタを出ます.
3.定義者別:システム・ブロッカー、カスタム・ブロッカー.
 
【例】クライアントおよびサービス側にログ・ブロッキングを追加する方法を示します.
サービス・エンド・サーバTestにログ・ブロッキングを追加します.
public class ServerTest {
	public static void main(String[] args) {
		String address = "http://192.168.0.102:8989/day01_ws/hellows";
		Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
		System.out.println(endpoint);
		EndpointImpl endpointImpl = (EndpointImpl)endpoint;	
		//          
		List> inInterceptors = endpointImpl.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor());	
		//          
		List> outInterceptors = endpointImpl.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());	
		System.out.println("  webservice  !");
	}
}

クライアントClientTestにログ・ブロッキングを追加します.
public class ClientTest {
	public static void main(String[] args) {
		HelloWSImplService factory = new HelloWSImplService();
		HelloWs helloWs = factory.getHelloWSImplPort();		
		//          
		Client client = ClientProxy.getClient(helloWs);		
		//          
		List> outInterceptors = client.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());		
		//          
		List> inInterceptors = client.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor());		
		String result = helloWs.sayHello("xdy");
		System.out.println(result);
	}
}

2、CXFカスタムブロック
AbstractPhaseInterceptor:抽象プロシージャ・ブロッカー.一般的にカスタマイズされたブロッカーが継承されます.
機能:ユーザー名とパスワードのチェックをカスタムブロッカーで実現
1.クライアントブロッカー:outブロッカーを設定し、soapメッセージにユーザー名とパスワードデータを追加する
public class MyInterceptor extends AbstractPhaseInterceptor {
	private String name;
	private String password;

	public MyInterceptor(String name,String password) {
		super(Phase.PRE_PROTOCOL);
		this.name = name;
		this.password = password;
	}

	/*
	  
	 	
	 		
	 			xiongdy
	 			123456
	 		
	 	
	 	
	 		
	 			xdy
	 		
	  	
	 
	 */
	public void handleMessage(SoapMessage message) throws Fault {
		 List
headers = message.getHeaders(); /* xiongdy 123456 */ //Document document = DOMHelper.createDocument(); Document document = DOMUtils.createDocument(); // Element rootEle = document.createElement("xdy"); //xiongdy Element nameEle = document.createElement("name"); nameEle.setTextContent(name); rootEle.appendChild(nameEle); //123456 Element passwordEle = document.createElement("password"); passwordEle.setTextContent(password); rootEle.appendChild(passwordEle); //
headers.add(new Header(new QName("xdy"), rootEle)); System.out.println("client-----handleMessage"); } }

2.サービス側ブロック:inブロックを設定し、soapメッセージからユーザー名とパスワードデータを取得し、条件を満たさなければwebサービスを実行しない方法
public class MyInterceptor extends AbstractPhaseInterceptor {
	public MyInterceptor() {
		super(Phase.PRE_PROTOCOL);
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		System.out.println("server-----handleMessage");
		
		Header header = msg.getHeader(new QName("xdy"));
		if(header==null) {
			throw new Fault(new RuntimeException("         "));
		} else {
			Element data = (Element) header.getObject();
			if(data==null) {
				throw new Fault(new RuntimeException("        22"));
			} else {
				String name = data.getElementsByTagName("name").item(0).getTextContent();
				String password = data.getElementsByTagName("password").item(0).getTextContent();
				if(!"xiongdy".equals(name) || !"123456".equals(password)) {
					throw new Fault(new RuntimeException("        "));
				}
			}
		}
		System.out.println("      !");
	}
}

3.サービス側テストコード:
public class ServerTest {
	public static void main(String[] args) {
		String address = "http://192.168.0.102:8989/day01_ws/hellows";
		Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
		System.out.println(endpoint);
		EndpointImpl endpointImpl = (EndpointImpl)endpoint;
		
		//           
		List> inInterceptors = endpointImpl.getInInterceptors();
		inInterceptors.add(new MyInterceptor());
		
		System.out.println("  webservice  !");
	}
}

4.クライアントテストコード
public class ClientTest2 {
	public static void main(String[] args) {
		HelloWSImplService factory = new HelloWSImplService();
		HelloWs helloWs = factory.getHelloWSImplPort();
		
		//          
		Client client = ClientProxy.getClient(helloWs);
		
		//           
		List> outInterceptors = client.getOutInterceptors();
		outInterceptors.add(new MyInterceptor("xiongdy", "123456"));
		
		String result = helloWs.sayHello("xdy");
		System.out.println(result);
	}
}

/*********************************************************************************************/
SpringベースのWebServiceをCXFで作成
サーバ側:
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.SEIとその実装の定義
@WebService
public interface OrderService {
	@WebMethod
	public Order getOrderByNo(String orderNo);
}
@WebService
public class OrderServiceImpl implements OrderService {
	public OrderServiceImpl() {
		System.out.println("OrderServiceImpl()");
	}

	public Order getOrderByNo(String orderNo) {
		System.out.println("getOrderByNo() orderNO=" + orderNo);
		return new Order(3, orderNo, 10000000);
	}
}
public class Order {
	private int id;
	private String orderNo;
	private double price;
}

3.Webサービスの公開
beans.xml


	
	
	
	

	
	

Web.xml


	
		index.jsp
	

	
	
		contextConfigLocation
		classpath:beans.xml
	

	
	
		org.springframework.web.context.ContextLoaderListener
	

	
	
		CXFServlet
		org.apache.cxf.transport.servlet.CXFServlet
		1
	
	
		CXFServlet
		/*
	

クライアント側
1.Webプロジェクトを新規作成し、cxfのjarパッケージをインポートする
2.wsdlドキュメントに基づいてクライアントコードを生成する(src下)
3. client-beans.xml

	
	

4.テストコードの作成:
public class ClientTest {
	public static void main(String[] args) {
		//   client-beans.xml
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("client-beans.xml");
		//   bean id      OrderService
		OrderService orderService = (OrderService) context.getBean("orderClient");
		//     ,  soap  
		Order order = orderService.getOrderByNo("hao123");
		System.out.println("client " + order.getId() + "_" + order.getOrderNo()+ "_" + order.getPrice());
	}
}

/*********************************************************************************************/
SpringベースのWebService追加ブロッカーをCXFで作成
クライアント:
client-beans.xml:

	
	
			
				
					
					
				
			
	

クライアントブロッカーMyInterceptor:
public class MyInterceptor extends AbstractPhaseInterceptor {
	private String name;
	private String password;

	public MyInterceptor(String name,String password) {
		super(Phase.PRE_PROTOCOL);
		this.name = name;
		this.password = password;
		System.out.println("MyInterceptor.....");
	}
	
	public MyInterceptor() {
		super(Phase.PRE_PROTOCOL);
		System.out.println("MyInterceptor.....^_^");
	}

	/*
	  
	 	
	 		
	 			xiongdy
	 			123456
	 		
	 	
	 	
	 		
	 			xdy
	 		
	  	
	 
	 */
	public void handleMessage(SoapMessage message) throws Fault {
		 List
headers = message.getHeaders(); /* xiongdy 123456 */ //Document document = DOMHelper.createDocument(); Document document = DOMUtils.createDocument(); // Element rootEle = document.createElement("xdy"); //xiongdy Element nameEle = document.createElement("name"); nameEle.setTextContent(name); rootEle.appendChild(nameEle); //123456 Element passwordEle = document.createElement("password"); passwordEle.setTextContent(password); rootEle.appendChild(passwordEle); //
headers.add(new Header(new QName("xdy"), rootEle)); System.out.println("client-----handleMessage"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

サーバ側:
Beans.xml:


	
	
	
	

	
	
		
			
		
	

サービス・エンド・ブロッカーMyInterceptor:
public class MyInterceptor extends AbstractPhaseInterceptor {
	
	public MyInterceptor() {
		super(Phase.PRE_PROTOCOL);
	}

	public void handleMessage(SoapMessage msg) throws Fault {
		System.out.println("server-----handleMessage");
		
		Header header = msg.getHeader(new QName("xdy"));
		if(header==null) {
			throw new Fault(new RuntimeException("         "));
		} else {
			Element data = (Element) header.getObject();
			if(data==null) {
				throw new Fault(new RuntimeException("        22"));
			} else {
				String name = data.getElementsByTagName("name").item(0).getTextContent();
				String password = data.getElementsByTagName("password").item(0).getTextContent();
				if(!"xiongdy".equals(name) || !"123456".equals(password)) {
					throw new Fault(new RuntimeException("        "));
				}
			}
		}
		System.out.println("      !");
	}
}