這裡把Web服務端和用戶端分開,用兩個項目寫
下面展示的是服務端代碼
首先是web.xml和services.xml
<?xml version="1.0" encoding="UTF-8"?><br /><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><br /> <servlet><br /> <servlet-name>XFireServlet</servlet-name><br /> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class><br /> <load-on-startup>0</load-on-startup><br /> </servlet><br /> <servlet-mapping><br /> <servlet-name>XFireServlet</servlet-name><br /> <url-pattern>/services/*</url-pattern><br /> </servlet-mapping><br /></web-app></p><p><?xml version="1.0" encoding="UTF-8"?><br /><beans xmlns="http://xfire.codehaus.org/config/1.0"><br /><service><br /><name>XFireExceptionDemo</name><br /><namespace>http://www.jadyer.com/XFireExceptionDemo</namespace><br /><serviceClass>com.jadyer.server.HelloExceptionService</serviceClass><br /><implementationClass>com.jadyer.server.HelloExceptionServiceImpl</implementationClass><br /></service><br /></beans>
接著是Web服務端暴露的介面及其實作類別
package com.jadyer.server;<br />import com.jadyer.server.exception.MyException;<br />public interface HelloExceptionService {<br />public String getException(String message) throws MyException;<br />}</p><p>package com.jadyer.server;<br />import com.jadyer.server.exception.MyException;<br />import com.jadyer.server.exception.MyExceptionDetail;<br />public class HelloExceptionServiceImpl implements HelloExceptionService {<br />public String getException(String sss) throws MyException {<br />if("".equals(sss)){<br />throw new MyException("參數不可為空", new MyExceptionDetail("XFire異常測試成功"));<br />}else{<br />return sss;<br />}<br />}<br />}
然後是我們的自訂異常的描述類
package com.jadyer.server.exception;</p><p>import java.io.Serializable;</p><p>/**<br /> * 異常描述類<br /> * @see 必須要顯式或隱式的提供預設建構函式<br /> */<br />public class MyExceptionDetail implements Serializable {<br />private static final long serialVersionUID = -6043027006141857552L;</p><p>private String message;</p><p>public MyExceptionDetail(){}</p><p>public MyExceptionDetail(String message){<br />this.message = message;<br />}</p><p>public String getMessage() {<br />return message;<br />}<br />public void setMessage(String message) {<br />this.message = message;<br />}<br />}
最後是我們的自訂異常的處理類
package com.jadyer.server.exception;</p><p>import org.codehaus.xfire.fault.FaultInfoException;</p><p>/**<br /> * 處理異常的基本類<br /> * @see 這裡主要繼承了FaultInfoException類<br /> */<br />public class MyException extends FaultInfoException{<br />private static final long serialVersionUID = -9010056196582741518L;</p><p>private MyExceptionDetail med;</p><p>public MyException(String message, MyExceptionDetail med){<br />super(message);<br />this.med = med;<br />}</p><p>public MyExceptionDetail getFaultInfo(){<br />return med;<br />}<br />}
Web服務端代碼,至此完畢
對於用戶端,我們另建一個Java Project
package com.jadyer.client;</p><p>import java.net.MalformedURLException;</p><p>import org.codehaus.xfire.client.XFireProxyFactory;<br />import org.codehaus.xfire.service.Service;<br />import org.codehaus.xfire.service.binding.ObjectServiceFactory;</p><p>import com.jadyer.server.HelloExceptionService;<br />import com.jadyer.server.exception.MyException;</p><p>/**<br /> * 用戶端的對自訂異常的測試類別<br /> * @see 需要用到XFire 1.2 Core、HTTP Client Libraries兩個類庫<br /> * @see 此時假設Web服務端已經提供了介面以及自訂異常的描述類和處理類<br /> */<br />public class ExceptionClient {<br />private static final String URL = "http://127.0.0.1:8080/XFire_Exception/services/XFireExceptionDemo";<br />private static final String namespace = "http://www.jadyer.com/XFireExceptionDemo";</p><p>public static void main(String[] args) {<br />Service serviceModel = new ObjectServiceFactory().create(HelloExceptionService.class, null, namespace, null);<br />try{<br />HelloExceptionService client = (HelloExceptionService)new XFireProxyFactory().create(serviceModel, URL);<br />String result = client.getException("這是我進行異常測試時使用的字串訊息"); //此時不會出現異常<br />System.out.println(result);<br />client.getException(""); //此時將會出現異常<br />}catch(MalformedURLException e){<br />e.printStackTrace();<br />}catch(MyException e){<br />e.printStackTrace();<br />System.out.println(e.getFaultInfo().getMessage());<br />}<br />}<br />}
然後運行ExceptionClient類,控制台若輸出如下資訊,則測試成功
這是我進行異常測試時使用的字串訊息<br />com.jadyer.server.exception.MyException: 參數不可為空<br />at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)<br />at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)<br />at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)<br />at java.lang.reflect.Constructor.newInstance(Constructor.java:494)<br />at org.codehaus.xfire.client.ClientFaultConverter.processFaultDetail(ClientFaultConverter.java:57)<br />at org.codehaus.xfire.client.ClientFaultConverter.invoke(ClientFaultConverter.java:32)<br />at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)<br />at org.codehaus.xfire.client.Client.onReceive(Client.java:424)<br />at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)<br />at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)<br />at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)<br />at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)<br />at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)<br />at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)<br />at org.codehaus.xfire.client.Client.invoke(Client.java:336)<br />at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)<br />at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)<br />at $Proxy0.getException(Unknown Source)<br />at com.jadyer.client.ExceptionClient.main(ExceptionClient.java:27)<br />XFire異常測試成功