0

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

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

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

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

查看CXF 文档,我知道我必须扩展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

    }
}

我该怎么做呢 ?

提前致谢。

4

2 回答 2

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。

于 2013-04-04T14:57:40.067 回答
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 也可以工作。

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

于 2012-10-04T12:18:16.633 回答