簡體   English   中英

具有Web服務的應用程序中的異常處理的最佳方式

[英]The best way of exception handling in an app with web services

我有一個應用程序,它包含SOAP和REST Web服務以及簡單的HTTP訪問。 它們都轉換傳入的請求並將它們發送給處理程序。 最痛苦的是異常處理。 為了返回正確的響應,我必須使用try-catch塊包裝每個方法並在那里創建響應。

我以為我可以創建一個可以做到的過濾器。 但是過濾器如何識別它的來源(肥皂,休息前端),所以我知道我應該返回SOAP或其他響應?

它取決於您使用的WS框架。 我所知道的有一些攔截器/方面,你可以在一個地方注入和處理異常。 例如,在 ,甚至還有一個特殊的出站錯誤鏈 ,您可以在其中插入自己的攔截器。

顯然,在每種方法中try-catch都是一個壞主意。

Web-Service Layer下面Web-Service Layer ,您必須創建自定義Exception並且在Web-Service layer您必須使用try-catch方法來實現occurred exception並在catchlog中將其轉換為您的自定義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/

你可以自定義你的課程!! 做吧!

輕松診斷錯誤,例如插入協議號,消息日志,消息客戶端等...

http://java.globinch.com/enterprise-java/web-services/jax-ws/jax-ws-exceptions-faults-annotation-exception-and-fault-handling-examples/#Pre-Requisites

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM