【问题标题】:The best way of exception handling in an app with web services在具有 Web 服务的应用程序中处理异常的最佳方式
【发布时间】:2012-03-07 08:21:01
【问题描述】:

我有一个应用程序,它包含 SOAP 和 REST Web 服务以及一个简单的 HTTP 访问。它们都转换传入的请求并将它们发送到处理程序。最痛苦的是异常处理。为了返回正确的响应,我必须用 try-catch 块包装每个方法并在那里创建一个响应。

我认为我可以创建一个可以做到这一点的过滤器。但是过滤器如何识别它的来源(soap,rest frontend),所以我知道我应该返回一个 SOAP 或其他响应?

【问题讨论】:

    标签: java web-services exception-handling cxf


    【解决方案1】:

    这取决于您使用的 WS 框架。我所知道的有某种拦截器/方面,您可以在一个地方注入和处理异常。例如,在 中甚至还有一个特殊的出站error chain,您可以在其中插入自己的拦截器。

    显然try-catch 在每种方法中都是一个坏主意。

    【讨论】:

    • 我忘了提到 - 我正在使用 Apache CXF。我会试试那些拦截器,谢谢。
    【解决方案2】:

    Web-Service Layer下面的层,你必须创建你的自定义Exception,在Web-Service layer你必须使用try-catch方法来实现occurred exceptioncatchlog并转换它到您的自定义 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-Service frameworks 中使用AOP 方法(对于示例Spring AOP)或interceptor 方法(对于JAX-WS 中的示例SOAPHandler<T>)。

    注意:在JAX-WS 标准中,你不能throwRuntimeException 因为Exception 必须在最后指定WSDL 并且如果你throwRuntimeException您的 Web 服务客户端无法实现您的 CustomException,在另一个您的 Web-Method 需要自己签名。

    您可以查看选定的Web-Service faramework 文档以获取更多信息。

    【讨论】:

      【解决方案3】:

      听起来您没有使用任何框架,因为这是典型的框架提供的。例如,Spring 允许您将代码与异常处理分离并定义您的自定义异常处理程序。

      在您的情况下,您通常有 2 个解决方案。

      (1) 你可以使用装饰器模式:用装饰器包装每个服务,其中每个方法都实现为

      try {
          call real method
      } catch() {
         send error to client
      }
      

      由于它非常冗长,您可以使用动态代理(Java 5 中引入的功能)节省时间。因此,您可以动态包装每个服务(如果您的服务已定义接口)。

      (2) 可以使用 servlet API 的错误页面解决:

      javax.servlet.ServletException /servlet/错误显示

      更多详情见http://java.sun.com/developer/technicalArticles/Servlets/servletapi2.3/

      【讨论】:

        【解决方案4】:

        你可以自定义你的班级!!去做吧!

        轻松处理诊断错误,例如插入协议号、消息日志、消息客户端等...

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-04
          • 2015-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          相关资源
          最近更新 更多