Java 用于引发特定于客户端的异常的JAX RS CXF拦截器

Java 用于引发特定于客户端的异常的JAX RS CXF拦截器,java,exception,cxf,jax-rs,interceptor,Java,Exception,Cxf,Jax Rs,Interceptor,我有一个将一组类公开为RESTful服务的服务器。我知道我们可以使用它将异常传递给客户端。客户端和服务器之间共享的检查异常很少。然而,在我的一些服务中,我有一些在客户端JVM中不可用的检查异常 我理解,更改端点以确保正确处理选中的异常可以解决此问题 但是,我想在拦截器层这样做有两个原因: 这将是一个单一的地方,在这里我可以处理导致选中异常的所有调用 由于目前的发布日期,这将是一项巨大的重构工作 现在,我知道我必须扩展AbstractPhaseInterceptor并重写handleMessa

我有一个将一组类公开为RESTful服务的服务器。我知道我们可以使用它将异常传递给客户端。客户端和服务器之间共享的检查异常很少。然而,在我的一些服务中,我有一些在客户端JVM中不可用的检查异常

我理解,更改端点以确保正确处理选中的异常可以解决此问题

但是,我想在拦截器层这样做有两个原因:

  • 这将是一个单一的地方,在这里我可以处理导致选中异常的所有调用
  • 由于目前的发布日期,这将是一项巨大的重构工作
现在,我知道我必须扩展
AbstractPhaseInterceptor
并重写
handleMessage()

公共类MyOutExceptionInterceptor扩展了AbstractPhaseInterceptor{
公共附件接收者(){
//在这里调用哪个阶段??
超级(阶段后调用);
}
公共无效handleMessage(消息消息){
//从消息中检查它是否包含MyCheckedException.class的异常
//创建一个客户端可以理解的异常
}
}
我该怎么做

提前谢谢

试试以下方法:

public void handleMessage(Message message) {
 // Map exception
    Exception exception = message.getContent(Exception.class);
    Exception mappedException = mapper.map(exception);

    Fault fault = exception instanceof Fault ? (Fault) exception : null;
    if (fault == null)
    {
        fault = new Fault(exception);
        message.setContent(Exception.class, fault);
     }
    fillInFaultDetails(fault, exception);
}
这实际上是我们代码中的一个片段(为了简洁起见,我省略了映射/填充细节;要做的关键事情是替换消息内容)。至于阶段-我们在逻辑后运行它;POST_调用也可以工作


顺便说一句-不确定您的用例是什么,但我不喜欢使用故障来传达业务异常(在我看来,故障表示一般的消息处理错误,而不是业务逻辑异常。

我知道我迟到了,但我也遇到了这个问题,并提出了这个解决方案。因此,作为将来的参考:

改为覆盖handleFault,内部:

Exception fault = message.getContent(Exception.class);
Exception exception = fault.getCause();
YourOwnFault newFault = new YourOwnFault("bla bla bla");
message.setContent(Exception.class, newFault);

换句话说:提取故障,获取异常作为原因,创建新故障并插入int。

感谢您的回复。但是我在
fault=new fault(异常)处得到一个运行时异常
在带有此代码的链接拦截器中。这是什么类型的异常?您没有使用
异常
变量。那么为什么要得到它?可能在您自己的fault的构造函数中使用它,而不是“bla-bla-bla-bla”。
Exception fault = message.getContent(Exception.class);
Exception exception = fault.getCause();
YourOwnFault newFault = new YourOwnFault("bla bla bla");
message.setContent(Exception.class, newFault);