2013-02-15 69 views
1

我有使用cxf調度行爲的這個問題。 我開發了一個實現org.apache.cxf.jaxrs.ext.RequestHandler接口的Interceptor。 在其「公共響應handleRequest(Message m,ClassResourceInfo resourceClass)」方法中,我拋出一個異常(例如WebServiceException)或一個Fault。我沒有明顯的問題,但是,在客戶端,客戶端收到一個不同的異常(一個ServerWebApplicationException),錯誤消息爲空。從org.apache.cxf.jaxrs.ext.RequestHandler中引發異常handleRequest方法

下面的代碼:

服務器端:在客戶端收到

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="" 
..... 

我收到了同樣的異常也是,如果我扔了故障。 問題是什麼?我必須使用另一個異常?爲什麼? 非常感謝,

安德烈

回答

1

OK,我已經找到了解決辦法。
我已經在調度器上註冊了一個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(); 
    } 

安德烈

0

@WebFault

例如標註您的例外:

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

非常感謝,可惜我已經試過,但具有相同錯誤的行爲和相同的空ServerWebApplicationException收到客戶端上的繼續。 – Andrea 2013-02-16 07:16:15