新四季網

webservice如何增強性能(動力節點WebService處理異常信息方法)

2023-04-17 09:47:43

在數據傳遞和遠程調用過程中,有時候調用者傳遞錯誤的數據和是調用的方法錯誤。在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時的一些日常異常問題,得到更好的編程體驗。

,
同类文章
葬禮的夢想

葬禮的夢想

夢見葬禮,我得到了這個夢想,五個要素的五個要素,水火只好,主要名字在外面,職業生涯良好,一切都應該對待他人治療誠意,由於小,吉利的冬天夢想,秋天的夢是不吉利的
找到手機是什麼意思?

找到手機是什麼意思?

找到手機是什麼意思?五次選舉的五個要素是兩名士兵的跡象。與他溝通很好。這是非常財富,它擅長運作,職業是仙人的標誌。單身男人有這個夢想,主要生活可以有人幫忙
我不怎麼想?

我不怎麼想?

我做了什麼意味著看到米飯烹飪?我得到了這個夢想,五線的主要土壤,但是Tu Ke水是錢的跡象,職業生涯更加真誠。他真誠地誠實。這是豐富的,這是夏瑞的巨星
夢想你的意思是什麼?

夢想你的意思是什麼?

你是什​​麼意思夢想的夢想?夢想,主要木材的五個要素,水的跡象,主營業務,主營業務,案子應該抓住魅力,不能疏忽,春天夢想的吉利夢想夏天的夢想不幸。詢問學者夢想
拯救夢想

拯救夢想

拯救夢想什麼意思?你夢想著拯救人嗎?拯救人們的夢想有一個現實,也有夢想的主觀想像力,請參閱週宮官方網站拯救人民夢想的詳細解釋。夢想著敵人被拯救出來
2022愛方向和生日是在[質量個性]中

2022愛方向和生日是在[質量個性]中

[救生員]有人說,在出生88天之前,胎兒已經知道哪天的出生,如何有優質的個性,將走在什麼樣的愛情之旅,將與生活生活有什么生活。今天
夢想切割剪裁

夢想切割剪裁

夢想切割剪裁什麼意思?你夢想切你的手是好的嗎?夢想切割手工切割手有一個真正的影響和反應,也有夢想的主觀想像力。請參閱官方網站夢想的細節,以削減手
夢想著親人死了

夢想著親人死了

夢想著親人死了什麼意思?你夢想夢想你的親人死嗎?夢想有一個現實的影響和反應,還有夢想的主觀想像力,請參閱夢想世界夢想死亡的親屬的詳細解釋
夢想搶劫

夢想搶劫

夢想搶劫什麼意思?你夢想搶劫嗎?夢想著搶劫有一個現實的影響和反應,也有夢想的主觀想像力,請參閱週恭吉夢官方網站的詳細解釋。夢想搶劫
夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂

夢想缺乏缺乏紊亂什麼意思?你夢想缺乏異常藥物嗎?夢想缺乏現實世界的影響和現實,還有夢想的主觀想像,請看官方網站的夢想組織缺乏異常藥物。我覺得有些東西缺失了