Ta có thể dùng lệnh wsimport để tạo ra mã nguồn Java cho dịch vụ web Soap từ một tập tin wsdl như sau :
$ wsimport -keep ToanService.wsdl
Nếu tập tin wsdl phụ thuộc vào một vài tập tin xml(xsd), ta có thể gọi thêm các tập tin ấy khi phát sinh code như sau :
$ wsimport -extension -keep -b Toan1_binding.xml -b Toan2_binding.xml ToanService.wsdl
Chương trình wsimport nằm trong thư mục bin của Java cài đặt trên máy, chẳng hạn :
C:\Java\jdk1.7.0_80\bin\wsimport.exe
Kiểm tra phiên phản của JAX-WS :
$ "C:\Java\jdk1.7.0_80\bin\wsimport.exe" -version
Thông thường với wsimport là ta đủ để phát sinh mã nguồn Java từ một WSDL, tuy nhiên phiên bản mới của wsimport không còn hỗ trợ một vài cấu trúc quá cũ, chẳng hạn như rpc/encoded :
parsing WSDL... [ERROR] "Use of SOAP Encoding is not supported. SOAP extension element on line 44 in file ToanService.wsdl has use="encoded" "
Dòng bị báo lỗi có định nghĩa như sau :
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://ToanService/" use="encoded"/>
Không còn dịch vụ web hiện đại nào còn dùng đến cấu trúc rpc/encoded cổ lỗ này nữa, giờ đa phần sử dụng document/literal
Tuy nhiên Apache Axis v1 vẫn có thể giúp ta phát sinh code Java cho các dịch vụ web dùng cấu trúc rpc/encoded này nếu cần. Ta phải tải về axis-1.4.jar và các jars mà nó phụ thuộc để phát sinh code Java bằng lệnh sau :
$ java -cp axis-1.4.jar;commons-logging-1.1.jar;jaxrpc-api-1.1.jar;commons-discovery-0.2.jar;saaj-1.1.jar;wsdl4j-1.4.jar;activation-1.1.jar;mail-1.4.jar org.apache.axis.wsdl.WSDL2Java ToanService.wsdl
Khi dùng Apache Axis, có thể gọi client web như sau :
ToanServiceServiceLocator service = new ToanServiceServiceLocator(); ToanServiceSoapBindingStub soapClient = new ToanServiceSoapBindingStub(new URL(service.getToanServiceAddress()), service); soapClient.getVersion();
Ta có thể xem soap request, response và lỗi trả về nếu có như sau :
String soapRequest = _call.getMessageContext().getRequestMessage().getSOAPPartAsString(); String soapResponse = _call.getMessageContext().getResponseMessage().getSOAPPartAsString(); if (_call.getResponseMessage().getSOAPPart().getEnvelope().getBody().getFault() != null) { responseFault = _call.getResponseMessage().getSOAPPart().getEnvelope().getBody().getFault().getFaultCode(); }
Không có nhận xét nào:
Đăng nhận xét