webservice如何增強性能(動力節點WebService處理異常信息方法)
2023-04-17 09:47:43 1
在數據傳遞和遠程調用過程中,有時候調用者傳遞錯誤的數據和是調用的方法錯誤。在Web Service中,不可避免地也會出現這些異常信息,那麼我們怎樣處理這些異常信息呢?本文就向大家介紹下Web Service處理異常信息方法。
1、編寫伺服器端的異常類,在遠處調用中(WebService)異常類繼承RemoteException,記得要序列化下,代碼如下:
package com.hoo.exception;
import java.rmi.RemoteException;
/**
* function:定製伺服器端異常信息
* @author hoojo
* @createDate Dec 17, 2010 00:00:52 AM
* @file RemoteServerException.java
* @package com.hoo.exception
* @project AxisWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
public class RemoteServerException extends RemoteException {
private static final long serialVersionUID = 1L;
private String message;
public String getMessage {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public RemoteServerException {
System.out.println("Remote Servier Exception ");
}
public void showMessage {
System.out.println(this.message);
}
}
2、編寫客戶端的異常信息類,和前面遠程傳遞對象一樣。因為我們並不知道伺服器端的異常信息類代碼,但是通過wsdl的xml文件的描述我們可以知道遠程異常類的基本信息:方法、方法參數、返回值等信息,下面是客戶端的異常信息類代碼:
package com.hoo.exception;
import java.rmi.RemoteException;
/**
* function:本地客戶端異常信息
* @author hoojo
* @createDate Dec 17, 2010 00:05:30 AM
* @file LocalClientException.java
* @package com.hoo.exception
* @project AxisWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
public class LocalClientException extends RemoteException {
private static final long serialVersionUID = 3;
private String message;
public String getMessage {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public LocalClientException {
System.out.println("Local Client Exception ");
}
public void showMessage {
System.out.println(this.message);
}
}
內容幾乎一樣,就是類名稱不同。
3、編寫觸發異常的WebService伺服器端代碼
package com.hoo.service;
import com.hoo.exception.RemoteServerException;
/**
* function:發出異常信息
* @author hoojo
* @createDate Dec 17, 2010 00:08:07 AM
* @file ThrowException.java
* @package com.hoo.service
* @project AxisWebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email [email protected]
* @version 1.0
*/
public class ThrowException {
public void doException throws RemoteServerException {
RemoteServerException rse = new RemoteServerException;
rse.setMessage("伺服器端出現異常");
throw rse;
}
}
4、定製wsdd文件,發布當前WebService。
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"/>
5、用定製好的wsdd文件發布我們的WebService,依舊是命令行:
C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deployException.wsdd
發布完成後,在瀏覽器中輸入:
http://localhost:8080/AxisWebService/servlet/AxisServlet
即可查看剛才發布的服務信息,但是你點擊wsdl連結的時候並不能看到xml的內容,那是因為伺服器端拋出了異常導致的。這個不是錯誤是正常的,不過你可以在web.xml中配置異常的信息頁面。
6、編寫客戶端代碼,這裡的代碼和傳遞對象的WebService也很類似
package com.hoo.client;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import com.hoo.exception.LocalClientException;
import com.hoo.exception.RemoteServerException;
public class TryExceptionClient {
/**
* function:捕捉伺服器端異常信息的WebService的客戶端
* @author hoojo
* @createDate Dec 17, 2010 00:12:56 AM
* @param args
* @throws ServiceException
* @throws RemoteException
*/
public static void main(String[] args) {
String url = "http://localhost:8080/AxisWebService/services/ThrowException";
Service service = new Service;
try {
Call call = (Call) service.createCall;
/**
* 註冊異常類信息和序列化類
* ns:CustomException 和 wsdd的對應
* Exception 和 wsdd的Exception對應
*/
QName qn = new QName("ns:CustomException", "Exception");
/**
* 這裡配置的LocalClientException,會將伺服器端的RemoteServerException轉換成本地的異常信息LocalClientException
*/
call.registerTypeMapping(LocalClientException.class, qn,
new BeanSerializerFactory(LocalClientException.class,qn),
new BeanDeserializerFactory(LocalClientException.class, qn));
call.setOperationName(new QName(url, "doException"));
call.setTargetEndpointAddress(url);
call.invoke(new Object[]{});
} catch (RemoteServerException e) {
e.showMessage;
System.out.println("RemoteServerException:" e.getMessage);
e.printStackTrace;
} catch (LocalClientException e) {
e.showMessage;
System.out.println("LocalClientException:" e.getMessage);
e.printStackTrace;
} catch (RemoteException e) {
System.out.println("RemoteException:" e.getMessage);
e.printStackTrace;
} catch (ServiceException e) {
System.out.println("ServiceException:" e.getMessage);
e.printStackTrace;
}
}
}
看上面的registerTypeMapping和wsdd文件中的typeMapping有些相同之處吧,下面運行下上面的代碼,結果如下:
Local Client Exception
伺服器端出現異常
LocalClientException:伺服器端出現異常
com.hoo.exception.LocalClientException: 伺服器端出現異常
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.apache.axis.encoding.ser.BeanDeserializer.(BeanDeserializer.java:104)
at org.apache.axis.encoding.ser.BeanDeserializerFactory.getGeneralPurpose(BeanDeserializerFactory.java:89)
at org.apache.axis.encoding.ser.BaseDeserializerFactory.getDeserializerAs(BaseDeserializerFactory.java:89)
at org.apache.axis.encoding.DeserializationContext.getDeserializer(DeserializationContext.java:464)
at org.apache.axis.encoding.DeserializationContext.getDeserializerForType(DeserializationContext.java:547)
at org.apache.axis.message.SOAPFaultDetailsBuilder.onStartChild(SOAPFaultDetailsBuilder.java:157)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.hoo.client.TryExceptionClient.main(TryExceptionClient.java:44)
伺服器端控制臺會輸出:Remote Servier Exception
這是在創建異常的時候,在構造函數中輸出的。
相信小夥伴們在看完本文後,能夠掌握這些Web Service處理異常信息方法,能夠更好地處理在使用Web Service時的一些日常異常問題,得到更好的編程體驗。
,