微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

axis1 八、WebService处理异常信息

在数据传递和远程调用过程中,有时候调用者传递错误的数据和是调用方法错误。那我们怎样处理这个错误方法有很多,这里介绍下用异常处理远程调用错误方法

1、编写服务器端的异常类,在远处调用中(WebService)异常类继承remoteexception,记得要序列化下,代码如下:

 

复制代码

   
   
package com.hoo.exception; import java.rmi.remoteexception; /** * <b>function:</b>定制服务器端异常信息 * @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 ; String message; String getMessage() { return message; } void setMessage(String message) { this .message RemoteServerException() { System.out.println( " Remote Servier Exception ); } showMessage() { System.out.println( .message); } }

复制代码

 

2、编写客户端的异常信息类,和前面远程传递对象一样。因为我们并不知道服务器端的异常信息代码,但是通过wsdl的xml文件的描述我们可以知道远程异常类的基本信息:方法方法参数、返回值等信息,下面是客户端的异常信息代码

* <b>function:</b>本地客户端异常信息 * LocalClientException 3 LocalClientException() { System.out.println( Local Client Exception 内容几乎一样,就是类名称不同。

3、编写触发异常的WebService服务器端代码

4、定制wsdd文件,发布当前WebService。

特别说明,这里多了3个xml标签元素。operation、fault、typeMapping,下面将依次介绍。

operation看看这个标签中的内容,就和我们最先看到的wsdl的xml文件中的方法标签很像。没错这里它指定的就是一个方法,operation就指定触发异常信息的方法。和你在服务器端触发异常的WebService的方法对应,qname是限定名称,xmlns是限定名称的命名空间。

fault的name一个名称,可以随便取。type就是你服务器端抛出异常的类型,这里服务器端抛出的RemoteServerException,所以类型就是RemoteServerException。如果你服务器端抛出的是NullPointException这里的type就是NullPointException。

typeMapping这个也很关键,和前面的beanMapping有几分相似特别是前面一段qname、xmlns、以及languageSpecificType都是一样的,用法也一样。分别和客户端的new QName("ns:CustomException","Exception");中的对应;其中serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"就是序列化的工厂类,deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"这个不说你也知道是反序列化的工厂类,encodingStyle这个是编码样式。

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也很类似

com.hoo.client; javax.xml.namespace.QName; javax.xml.rpc.ServiceException; org.apache.axis.client.Call; org.apache.axis.client.Service; org.apache.axis.encoding.ser.BeanDeserializerFactory; org.apache.axis.encoding.ser.BeanSerializerFactory; com.hoo.exception.LocalClientException; TryExceptionClient { * <b>function:</b>捕捉服务器端异常信息的WebService的客户端 * @param args * @throws ServiceException * remoteexception main(String[] args) { String url http://localhost:8080/AxisWebService/services/ThrowException ; Service service Service(); try { Call call (Call) service.createCall(); * 注册异常类信息和序列化类 * ns:CustomException 和 wsdd 配置文件中的typeMapping中的xmlns:myNSD="ns:CustomException"的对应 * Exception 和 wsdd 配置文件中的typeMapping中的qname="myNSD:Exception"的Exception对应 QName qn QName( ns:CustomException , Exception * 这里配置的LocalClientException,会将服务器端的RemoteServerException转换成本地的异常信息LocalClientException call.registerTypeMapping(LocalClientException. BeanSerializerFactory(LocalClientException. BeanDeserializerFactory(LocalClientException. etoperationName( QName(url,0); line-height:1.5!important">doException )); call.setTargetEndpointAddress(url); call.invoke( Object[]{}); } catch (RemoteServerException e) { e.showMessage(); System.out.println( RemoteServerException: + e.getMessage()); e.printstacktrace(); } (LocalClientException e) { e.showMessage(); System.out.println( LocalClientException: (remoteexception e) { System.out.println( remoteexception: (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. < init > (BeanDeserializer.java: 104 ) at org.apache.axis.encoding.ser.BeanDeserializerFactory.getGeneralPurpose(BeanDeserializerFactory.java: 89 ) at org.apache.axis.encoding.ser.BaseDeserializerFactory.getDeserializerAs(BaseDeserializerFactory.java: ) 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 2443 2366 1812 ) at com.hoo.client.TryExceptionClient.main(TryExceptionClient.java: 44 )
服务器端控制台会输出:Remote Servier Exception

这是在创建异常的时候,在构造函数输出的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐