1

我在使用 cxf 调度行为时遇到了这个问题。我开发了一个实现 org.apache.cxf.jaxrs.ext.RequestHandler 接口的拦截器。在它的“public Response handleRequest(Message m, ClassResourceInfo resourceClass)”方法中,我抛出了一个异常(例如一个WebServiceException)或一个故障。我没有明显的问题,但是在客户端,客户端收到一个不同的异常(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=""
.....

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

安德烈亚

4

2 回答 2

1

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

    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(); 
    }

安德烈亚

于 2013-02-19T07:10:34.510 回答
0

使用@WebFault注释您的异常

例子 :

@WebFault(name = "oauthFault")
public class OAuthException extends RuntimeException {
  ...
}
于 2013-02-15T13:11:13.067 回答