關於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
使用Eclipse的Axis1.4插件開發Web Service及客戶端