Java 在使用web服务的应用程序中处理异常的最佳方式

Java 在使用web服务的应用程序中处理异常的最佳方式,java,web-services,exception-handling,cxf,apache-cxf,Java,Web Services,Exception Handling,Cxf,Apache Cxf,我有一个应用程序,它由SOAP和RESTWeb服务以及一个简单的HTTP访问组成。它们都转换传入的请求并将它们发送给处理程序。最痛苦的事情是异常处理。为了返回正确的响应,我必须用try-catch块包装每个方法并在那里创建响应 我想我可以创建一个过滤器,可以做到这一点。但是,过滤器如何识别它的来源(soap、rest前端),以便我知道应该返回soap或其他响应 这取决于您使用的WS-framework。我所知道的只是一些拦截器/方面,您可以在一个地方注入和处理异常。例如,在中国甚至有一个特殊的出

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


我想我可以创建一个过滤器,可以做到这一点。但是,过滤器如何识别它的来源(soap、rest前端),以便我知道应该返回soap或其他响应

这取决于您使用的WS-framework。我所知道的只是一些拦截器/方面,您可以在一个地方注入和处理异常。例如,在中国甚至有一个特殊的出站,您可以在那里插入自己的拦截器


显然,在每种方法中尝试catch都是一个坏主意

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

在您的情况下,通常有两种解决方案

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

try {
    call real method
} catch() {
   send error to client
}
因为它非常冗长,所以使用动态代理(Java5中引入的特性)可以节省时间。所以,您可以动态地包装每个服务(如果您的服务定义了接口)

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

javax.servlet.ServletException /servlet/ErrorDisplay


有关更多详细信息,请参见下面的
Web服务层中的,您必须创建自定义的
异常
,并且在
Web服务层
中,您必须使用
try catch
方法来实现
发生的异常
,并在
catch
日志
中将其转换为自定义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方法中使用try-catch
,您可以在
Web服务框架中使用
AOP
方法(对于示例
Spring-AOP
)或
interceptor
方法(对于
JAX-WS
中的示例
SOAPHandler

注意:在
JAX-WS
标准中,您不能
抛出
运行时异常
,因为
异常
必须在final
WSDL
中指定,如果
抛出
运行时异常
您的web服务客户端无法实现
自定义异常
,在另一种情况下,您的
Web方法
需要在其自身加入签名


您可以查看所选的
Web服务
faramework文档以了解更多信息。

您可以自定义您的类!!做吧

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


我忘了提到这一点-我正在使用Apache CXF。我试试那些拦截器,谢谢。