Axis2:服务级别上所有异常的异常处理程序

时间:2014-10-03 12:16:55

标签: java web-services soap exception-handling axis2

我有不同的Axis2服务,它们公开了一些方法,并希望将这些服务及其所有方法包装在类似try的东西中,以便能够在Axis2将它们发送到客户端之前过滤所有发生的异常。我已经阅读了有关阶段和流程以及处理程序和OutFaultFlow等内容,但我想要的是服务级别的内容,可以由服务本身在启动时配置。我的服务应该尽可能自我控制。我已经有一些服务需要在启动时初始化,因此我已经实现了Axis2提供的ServiceLifeCycle接口。

但我似乎无法从提供的ConfigurationContext或AxisService获取服务周围的“更高”的东西,并为任何流程注册一些新的处理程序,或者我可以拦截异常并决定如何继续与那些。

有没有办法在启动时注册流处理程序或这样形成服务级别?除了在我所有暴露的方法中添加try catch之外,您还有其他想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

根本不是那么难:只需使用ConfigurationContext.getAxisConfigurationAxisConfiguration.getOutFaultFlowPhases来迭代startUp方法中的已注册阶段。我目前正在搜索一个始终存在的阶段,例如“MessageOut”,并在其末尾用我自己的逻辑简单地add a handler。注册处理程序的逻辑只需要考虑到之前的另一个服务已经注册了处理程序,因此首先将所有已注册处理程序的名称与您自己提供的名称进行比较。

该方法保证处理程序仅在服务启动时注册,并且在方法调用期间根本不引入任何开销。但它当然是全球性的。

我没有测试的另一种方法是使用MessageContext来获取OutTransport和register a handler。这可能是也可能不是本地消息,但也许值得尝试某人。

synchronized static void register(ConfigurationContext context)
{
    Phase hookPhase = null;
    for (Phase phase: context.getAxisConfiguration().getOutFaultFlowPhases())
    {
        for (Handler handler : phase.getHandlers())
        {
            if (WsExceptionFilter.isMe(handler))
            {
                return;
            }
        }

        if (phase.getPhaseName().equals("MessageOut"))
        {
            hookPhase = phase;
        }
    }
    if (hookPhase == null)
    {
        throw new UnsupportedOperationException("Missing hook phase.");
    }

    hookPhase.addHandler(new WsExceptionFilter());
}