【问题标题】:Repeat CXF request in case of error出现错误时重复 CXF 请求
【发布时间】:2014-07-02 14:59:49
【问题描述】:
我有一个 OSGi 服务,我用 CXF 将它公开为一个简单的 Web 服务,并为此创建了一个调用其方法的客户端。该服务的方法接受作为其参数之一的签名票证,该票证标识执行请求的客户端。为了向来自我的客户端的所有请求注入此票证,我创建了一个 CXF 输出拦截器,我已将其绑定到 SETUP 阶段,并负责在传出消息中注入票证。
如果我的拦截器注入的票已过期,服务将抛出一个我希望能够捕获的异常,获取一张新票并用这张新票重复请求以完全抽象票-我的其余代码中的管理功能。因此,我创建了一个故障拦截器,我已将其绑定到 PRE_LOGICAL 阶段,并且我能够在其中识别我感兴趣的特定异常类型是否已被抛出。但是,我不确定如何重复请求并返回第二个请求的结果而不是第一个请求的结果。 CXF 是否为我提供了这样做的方法?
【问题讨论】:
标签:
java
web-services
cxf
【解决方案1】:
由于我无法找到通过故障拦截器重复请求的方法,我最终使用 InvocationHandler 来控制请求(有效地将我从 CXF 获得的代理包装在另一个代理中)。我最终得到的是如下内容:
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
// Configure factory
MyService serviceClient = (MyService) factory.create(MyService.class);
MyService proxy = (MyService) Proxy.newProxyInstance(
ServiceInvocationHandler.class.getClassLoader(),
new Class[] { MyService.class },
new ServiceInvocationHandler(serviceClient));
ServiceInvocationHandler 在哪里:
public class ServiceInvocationHandler implements InvocationHandler {
private final Object proxied;
private SignedTicket ticket;
public ServiceInvocationHandler(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object retVal = null;
try {
// Generate a ticket if the one held locally by this class is null
// and inject it in the method arguments
retVal = method.invoke(proxied, args);
} catch (Throwable t) {
if (t.getCause() instanceof InvalidTicketException) {
// Get a fresh ticket and inject it in the method arguments
retVal = method.invoke(proxied, args);
}
}
return retVal;
}
}