[英]The best way of exception handling in an app with web services
我有一個應用程序,它包含SOAP和REST Web服務以及簡單的HTTP訪問。 它們都轉換傳入的請求並將它們發送給處理程序。 最痛苦的是異常處理。 為了返回正確的響應,我必須使用try-catch塊包裝每個方法並在那里創建響應。
我以為我可以創建一個可以做到的過濾器。 但是過濾器如何識別它的來源(肥皂,休息前端),所以我知道我應該返回SOAP或其他響應?
它取決於您使用的WS框架。 我所知道的有一些攔截器/方面,你可以在一個地方注入和處理異常。 例如,在apache-cxf中 ,甚至還有一個特殊的出站錯誤鏈 ,您可以在其中插入自己的攔截器。
顯然,在每種方法中try-catch
都是一個壞主意。
在Web-Service Layer
下面Web-Service Layer
,您必須創建自定義Exception
並且在Web-Service layer
您必須使用try-catch
方法來實現occurred exception
並在catch
塊log
中將其轉換為您的自定義Web服務層異常。 我在下面展示了這種方法:
@WebService
public class EmployeeWS
{
@WebMethod
public void add(Employee em) throws CustomWebServiceException
{
try
{
// call facade layer method
}
catch(Exception e)
{
logger.error(e.getMessage());
throw new CustomWebServiceException(e);
}
}
}
在任何Web-Method
使用try catch的替代Web-Method
,您可以在Web-Service frameworks
使用AOP
approch(用於示例Spring AOP
)或interceptor
方法(對於JAX-WS
示例SOAPHandler<T>
)。
注意 :在JAX-WS
標准中,您不能throw
RuntimeException
因為Exception
必須在最終的WSDL
指定,如果throw
RuntimeException
您的Web服務客戶端不會實現您的CustomException
,而另一個Web-Method
需要拋出自己的拋出簽名。
您可以查看選定的Web-Service
框架文檔以獲取更多信息。
聽起來你沒有使用任何框架,因為這是典型的框架提供的。 例如,Spring允許您將代碼與異常處理分離,並定義自定義異常處理程序。
在您的情況下,您通常有2個解決方案。
(1)您可以使用Decorator模式:使用decorator包裝每個服務,其中每個方法都實現為
try {
call real method
} catch() {
send error to client
}
由於它非常冗長,您可以使用動態代理(java 5中引入的功能)節省時間。 因此,您可以動態地包裝每個服務(如果您的服務已定義接口)。
(2)您可以使用servlet API的錯誤頁面解決它:
javax.servlet.ServletException / servlet / ErrorDisplay
有關詳細信息,請參閱http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/
你可以自定義你的課程!! 做吧!
輕松診斷錯誤,例如插入協議號,消息日志,消息客戶端等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.