1

cxf ディスパッチ動作を使用すると、この問題が発生します。org.apache.cxf.jaxrs.ext.RequestHandler インターフェースを実装する Interceptor を開発しました。その「public Response handleRequest(Message 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=""
.....

Fault をスローした場合も同じ例外を受け取りました。何が問題ですか?別の例外を使用する必要がありますか? なんで?どうもありがとう、

アンドレア

4

2 に答える 2

1

OK、解決策を見つけました。
ディスパッチャにExceptionMapperを登録し、それを使用して、クライアントに送信される応答内に例外をカプセル化しました。これを行うために、インターセプターは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(); 
    }

アンドレア

于 2013-02-19T07:10:34.510 に答える
0

@WebFaultで例外に注釈を付けます

例 :

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