axis發布webservice客戶端


關於axis部署參考http://sducxh.iteye.com/blog/830414

注意這里是axis不是axis2

下載axis1.4地址:axis-bin-1_4.zip

環境配置:

JAVA_HOME C:\Program Files\Java\jdk1.6.0_23 
CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 
AXIS_HOME E:\soft4develop\axis-1_4
AXIS_LIB %AXIS_HOME%\lib 
AXISCLASSPATH %AXIS_LIB%\axis.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\commons-discovery-0.2.jar 

發布axis用的是tomcat ,發布的時候遇到一個問題

1 No compiler found in your classpath!  (you may need to add 'tools.jar')

解決的方式是

Copy the tools.jar in C:\Program Files\Java\jdk1.6.0_18\lib to C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib

也就是將JDK/LIB目錄下的tool.jar復制到tamcat/lib目錄下,1.5的JDK也沒問題。

如果tools.jar版本不對的話,就會爆出如下異常

faultCode: {http://xml.apache.org/axis/}Server.compileError

無法編譯你的Jws文件。

當然也可以通過環境變量來設置了。

1:Dynamic Invocation Interface動態調用接口

 1 String endpoint = "http://localhost:" +"8080"+ "/axis/HelloWorld.jws";//指明服務所在位置  
 2         Service service=new Service();
 3         Call call=null;
 4         try {
 5             call=    (Call) service.createCall();
 6             call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設置服務的位置 
 7              call.setOperationName( "sayHello" );//注意方法名與HelloWorld.java中一樣!! 
 8              String res = (String) call.invoke( new Object[] {} );//返回String,沒有傳入參數  
 9              System.out.println( res );  
10         } catch (ServiceException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         } catch (MalformedURLException e) {
14             // TODO Auto-generated catch block
15             e.printStackTrace();
16         } catch (RemoteException e) {
17             // TODO Auto-generated catch block
18             e.printStackTrace();
19         }

 

2:Dynamic Proxy動態代理方式 

 1.將DynimicProxy.java編譯成DynimicProxy.class,放到%TOMCAT_HOME%\webapps\axis\WEB-INF\classes下 

2、在%TOMCAT_HOME%\webapps\axis\WEB-INF下新建deploy.wsdd文件,即SOAP服務發布描述文件deploy.wsdd 

 

1 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
2     <service name="DynimicProxyService" provider="java:RPC">  
3         <parameter name="className" value="DynimicProxy"/>  
4         <parameter name="allowedMethods" value="hello"/>  
5     </service>  
6 </deployment> 

在DOS下轉換目錄到%TOMCAT_HOME%\webapps\axis\WEB-INF,命令: 

 java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd 

 你會發現目錄下多了一個server-config.wsdd文件,這就是AXIS的配置文件,以后所有的服務發布描述都會在里面找到。(當然,你可以直接修改它,不用再寫deploy.wsdd)然后打開瀏覽器http://localhost:8080/axis/servlet/AxisServlet,你就會看到你的服務已發布 

同樣用客戶端程序訪問一下:(注意和上邊的差別!!) 

客戶端訪問代碼

 1  String endpoint = "http://localhost:" +"8080"+ "/axis/services/DynimicProxyService";//注意!差別僅僅在這里!!  
 2           
 3            Service service = new Service();  
 4            Call call;
 5         try {
 6             call = (Call) service.createCall();
 7             call.setTargetEndpointAddress( new java.net.URL(endpoint) );  
 8             call.setOperationName("hello" );  
 9             call.addParameter("msg", XMLType.XSD_STRING, ParameterMode.IN);
10             call.setReturnType(XMLType.XSD_STRING);   
11             String res = (String) call.invoke( new Object[] {"lwx"} );  
12       
13                              System.out.println( res );  
14         } catch (Exception e) {
15             // TODO Auto-generated catch block
16             e.printStackTrace();
17         }  

打印結果: 您好,lwx

期間出現了兩個異常

 1 - No returnType was specified to the Call object!  You must call setReturnType() if you have called addParameter().
 2 AxisFault
 3  faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
 4  faultSubcode: 
 5  faultString: java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class DynimicProxy); nested exception is: 
 6     java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class DynimicProxy)
 7  faultActor: 
 8  faultNode: 
 9  faultDetail: 
10  {http://xml.apache.org/axis/}hostname:MICROSOF-AA33B2
11 
12 java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class DynimicProxy); nested exception is: 
13     java.lang.UnsupportedClassVersionError: Bad version number in .class file (unable to load class DynimicProxy)
14     at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
15     at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
16     at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
17     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:633)
18     at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanEndElement(XMLNSDocumentScannerImpl.java:713)
19     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1685)

一個是call忘記設置返回類型了

還有一個是編譯類的jdk版本跟tomcat的版本不一致造成的。(java.lang.UnsupportedClassVersionError: Bad version number in .class file)

如果用戶需要傳入和接收自定義對象的參數

如下DEMO可以參考下

1.自定義類User

 1 public class User {
 2     private String username;
 3     private String password;
 4 
 5     public String getUsername() {
 6         return username;
 7     }
 8 
 9     public void setUsername(String username) {
10         this.username = username;
11     }
12 
13     public String getPassword() {
14         return password;
15     }
16 
17     public void setPassword(String password) {
18         this.password = password;
19     }
20     
21     
22     public String toString(){
23         
24         return "username=="+username+"--password=="+password;
25     }

2.服務方法

 1 public class DynimicProxy {
 2 
 3     public String hello(String msg) {
 4 
 5         return "您好," + msg;
 6     }
 7 
 8     public String checkUser(User user) {
 9         if (null == user)
10             return "用戶信息錯誤";
11 
12         return "您好," + user.getUsername();
13     }
14 
15     public User getUser(String password, String username) {
16         User user = new User();
17         user.setPassword(password);
18         user.setUsername(username);
19         return user;
20     }

3.修改server-config.wsdd

1  <service name="DynimicProxyService" provider="java:RPC">
2   <parameter name="allowedMethods" value="*"/>
3   <parameter name="className" value="DynimicProxy"/>
4   <beanMapping languageSpecificType="java:User" 
5     qname="ns:User" xmlns:ns="urn:BeanService"/>
6  </service>
<parameter name="allowedMethods" value="*"/> --當方法很多個的時候 value的值采用通配符*
 <beanMapping languageSpecificType="java:User" 
qname="ns:User" xmlns:ns="urn:BeanService"/>
默認通過命令是無法生成這句話
需要手動加
languageSpecificType --對應的是用戶自定義類
qname-- 對應的是客戶端代碼的qname

4.客戶端調用
 1 String wsdlUrl = "http://localhost:8080/axis/services/DynimicProxyService?wsdl";
 2         String nameSpaceUri = "http://localhost:8080/axis/services/DynimicProxyService";
 3 
 4         Service service = new Service();
 5         Call call;
 6         String ret ="";
 7         try {
 8             // 公共部分
 9             call = (Call) service.createCall();
10             QName qn = new QName("urn:beanservice", "User");
11             call.registerTypeMapping(User.class, qn, new BeanSerializerFactory(
12                     User.class, qn),
13                     new BeanDeserializerFactory(User.class, qn));
14             // end
15 
16             // 調用hello 基礎類型參數
17              call.setOperationName(new QName(nameSpaceUri, "hello"));
18             call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
19             ret = (String) call.invoke(new Object[] { "lwx" });
20             System.out.println("return value is " + ret);
21     
22             // 調用checkUser  //自定義對象參數
23             QName getDescQn = new QName(nameSpaceUri, "checkUser");
24             call.setOperationName(getDescQn);
25             call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
26             User user = new User();
27             user.setPassword("88888");
28             user.setUsername("lwx");
29             
30              ret = (String) call.invoke(new Object[] { user });
31              
32              //getUser //返回自定義對象參數
33              QName getObjectQn = new QName(nameSpaceUri, "getUser");
34              call.setOperationName(getObjectQn);
35              call.setTargetEndpointAddress(new java.net.URL(wsdlUrl));
36              User user2 = (User) call.invoke(new Object[] { "123456","admin" });
37              System.out.println("return object " +user2.toString());
38              
39             // call.addParameter("msg", XMLType.XSD_STRING, ParameterMode.IN);
40             // call.setReturnType(XMLType.XSD_STRING);
41             
42             System.out.println(ret);
43         } catch (Exception e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         }

3:stubs方式

默認axis自帶的8個包不能滿足

需要額外加入activation.jar xerces.jar 和mail.jar 並同時配置環境變量

接着將axisclasspath加入到classpath中。

雖然如此,但是出異常

1 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/wsdl/WSDL2Java

各種嘗試都失敗了。真是蛋疼中。。

最后的問題是必須切換到jws或則wsdl的根目錄下,才可以正常編譯

正常編譯后出現

通過這個命令: java org.apache.axis.wsdl.WSDL2Java --server-side --skeletonDeploy true AddressBook.wsdl

來生成deploy.wsdd和undeploy.wsdd 文件

更多的請參考http://blog.csdn.net/manjianghong86/article/details/7311611

來到整體

我們使用自己的接口

則會在目錄下多了一個localhost的文件夾

HelloWorld.java 定義了Web服務接口,此例中只有一個sayHello方法。 

HelloWorldService.java 定義了用於獲取Web服務接口的方法。 

HelloWorldServiceLocator.java 接口HelloService的具體實現。 

HelloWorldSoapBindingStub.java Web服務客戶端樁,通過該類與服務器交互。 

這四個JAVA類幫我們處理了大部分的邏輯,我們需要的僅僅是把這些類加到我們的項目然后創建一個我們自己的類來調用它們即可。為此我們新加一個類Main.java,為了方便,讓這個類與剛產生的四個類都在同一個包下。內容如下: 

HelloWorld.jws源碼
1 public class HelloWorld {
2 public String sayHello()
3 {
4     return "HELLO WORLD!"; 
5 } 
6 }

客戶端調用

 1 HelloWorldService helloWorldService =new HelloWorldServiceLocator();
 2         
 3         try {
 4             HelloWorld helloWorld =helloWorldService.getHelloWorld();
 5             System.out.println(helloWorld.sayHello()); //HELLO WORLD!
 6         } catch (ServiceException e) {
 7             // TODO Auto-generated catch block
 8             e.printStackTrace();
 9         } catch (RemoteException e) {
10             // TODO Auto-generated catch block
11             e.printStackTrace();
12         }

 

當然也可以直接調用命令來完成

 

使用以下命令進行編譯: 

javac -classpath lib\axis.jar;lib\jaxrpc.jar localhost\axis\HelloWorld_jws\*.java 


如果編譯沒有問題的話執行該測試程序: 

java -Djava.ext.dirs=lib -cp . localhost.axis.HelloWorld_jws.Main//運行結果 

 1  package localhost.axis.Hello_jws;
 2  public class Main
 3  {
 4   public static void main(String[] args) throws Exception
 5   {
 6    HelloService service = new HelloServiceLocator();
 7    Hello hello = service.getHello();
 8    System.out.println("Response:"+hello.hello("BeatBLOG")); 
 9   }
10  }

好了 先如此了

關於axis2 aegis,webservice安全校驗 等日后在說吧 。

 

未完,待續。

java常見異常:http://wenku.baidu.com/view/2f931f7ea26925c52cc5bf35.html

java常用Jar介紹:http://picker.blog.51cto.com/60843/712839

axis2需要的Jar包

使用Eclipse的Axis1.4插件開發Web Service及客戶端

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM