用于抛出客户端特定异常的JAX RS CXF拦截器

时间:2012-10-04 11:58:28

标签: java exception cxf jax-rs interceptor

我有一个服务器将一组类暴露为RESTful服务。我知道我们可以使用ExceptionMapper将异常传递给客户端。客户端和服务器之间共享的检查异常很少。但是在我的一些服务中,我几乎没有客户端JVM中没有的检查异常。

我理解更改端点以确保正确处理已检查的异常可以解决问题。

但是,我想在拦截层执行此操作有两个原因:

  • 这是一个我可以处理导致检查异常的所有调用的地方。
  • 由于目前的发布日期,这将是一项重大的重构工作。

关注CXF documentation,我了解到我必须延长AbstractPhaseInterceptor并覆盖handleMessage()

public class MyOutExceptionInterceptor extends AbstractPhaseInterceptor<Message> {

    public AttachmentInInterceptor() {
        //Which phase to call here ??
        super(Phase.POST_INVOKE);
    }

    public void handleMessage(Message message) {

        //Check from message that it contains an exception of MyCheckedException.class
        //Create an exception that client can understand

    }
}

我该怎么做?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我知道我迟到但我也遇到了这个问题并提出了这个解决方案。所以供将来参考:

改为覆盖handleFault,内部:

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

换句话说:提取错误,将异常作为原因,创建新错误并插入int。

答案 1 :(得分:0)

尝试类似:

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_LOGICAL运行它; POST_INVOKE也可以正常工作。

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