我正在使用Apach CXF作为REST提供程序。

我想在进入Web服务时收集数据,在进入响应库之前收集数据,并向响应中添加一些计算。对于这个问题,为了简单起见,假设我要获取输入的开始时间,发送响应之前的完成时间,并将总时间添加到响应中。

现在,我该怎么做?我创建了可以单独使用的In和Out拦截器,但是如何在Out拦截器中使用In拦截器中的数据呢?

谢谢
伊多布

更新:

我试图将数据设置为上下文参数

message.setContextualProperty(key,value);

但是我在上得到NULL
message.getContextualProperty(key);

我也尝试过相同的方法
message.put(key,value) and message.get(key)

没用。

主意的人吗?

谢谢,
伊多布

最佳答案

您可以将值存储在 Exchange 上。 CXF为每个请求创建一个Exchange对象,以充当请求/响应对的输入和输出消息的容器,并使这两个对象都可以作为message.getExchange()进行访问。

在拦截器中:

public void handleMessage(Message inMessage) throws Fault {
  inMessage.getExchange().put("com.example.myKey", myCustomObject);
}

拦截器
public void handleMessage(Message outMessage) throws Fault {
  MyCustomObject obj = (MyCustomObject)outMessage.getExchange().get("com.example.myKey");
}

(反之亦然,对于客户端拦截器,其中out将存储值,而in将检索值)。选择一个您知道不会被其他拦截器使用的 key -带有包名的名称是一个不错的选择。请注意,像Message一样,ExchangeStringMap,并且具有通用的put/get方法(将Class作为键),从而为您提供了编译时类型的安全性,并省去了强制转换的麻烦:
theExchange.put(MyCustomObject.class, new MyCustomObject());
MyCustomObject myObj = theExchange.get(MyCustomObject.class);

关于java - Apache CXF-在In和Out拦截器之间共享数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12687235/

10-09 19:13
查看更多