从org.apache.cxf.jaxrs.ext.RequestHandler handleRequest方法抛出异常

时间:2013-02-15 09:08:06

标签: cxf

我使用cxf调度行为时遇到此问题。 我开发了一个实现org.apache.cxf.jaxrs.ext.RequestHandler接口的Interceptor。 在其“公共响应handleRequest(消息m,ClassResourceInfo resourceClass)”方法中,我抛出异常(例如WebServiceException)或Fault。我没有明显的问题,但在客户端,客户端收到一个不同的异常(ServerWebApplicationException),错误消息为空。

这里是代码:

服务器端:

    public class RestInterceptor implements RequestHandler {
       ......
       @Override
       public Response handleRequest(Message m, ClassResourceInfo resourceClass){
          .....
          throw new WebServiceException("Failure in the dispatching ws invocation!");
          .....
       }
    }

客户端收到ServerWebApplicationException:

Status : 500
Headers : 
Content-Length : 0
Connection : close
Server : Jetty(7.x.y-SNAPSHOT)

cause=null
detailMessage=null
errorMessage=""
.....

如果我抛出一个错误,我也收到了同样的例外。 问题是什么?我必须使用另一个例外吗?为什么? 非常感谢,

安德烈

2 个答案:

答案 0 :(得分:1)

好的,我找到了解决方案。
我在调度程序上注册了一个ExceptionMapper,并使用它将异常封装在发送给客户端的Response中。 为此,拦截器在Web服务发布中注册为提供者,并实现“ExceptionMapper”接口。在其“toResponse”方法中,它将异常封装在Response中。 看代码:

    public static<T extends Throwable>  Response convertFaultToResponse(T ex, Message inMessage) {
        ExceptionMapper<T>  mapper = ProviderFactory.getInstance(inMessage).createExceptionMapper(ex.getClass(), inMessage);
        if (mapper != null) {
            try {
                return mapper.toResponse(ex);
            } catch (Exception mapperEx) {
                mapperEx.printStackTrace();
                return Response.serverError().build();
            }
        }
        return null;
    }

    @Override
    public Response toResponse(Exception arg0) {
        ResponseBuilder builder = Response.status(Response.Status.INTERNAL_SERVER_ERROR).type("application/xml");
        String message = arg0.toString();
        return builder.entity(message).build(); 
    }

安德烈

答案 1 :(得分:0)

使用@WebFault

注释您的例外

示例:

@WebFault(name = "oauthFault")
public class OAuthException extends RuntimeException {
  ...
}