我使用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=""
.....
如果我抛出一个错误,我也收到了同样的例外。 问题是什么?我必须使用另一个例外吗?为什么? 非常感谢,
安德烈
答案 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(name = "oauthFault")
public class OAuthException extends RuntimeException {
...
}