Apache CXF - 在In和Out拦截器之间共享数据

Ido*_*ash 12 java cxf

我使用Apach CXF作为REST提供程序.

我想在进入Web服务时收集数据,在输入resposne之前收集数据并在响应中添加一些计算.对于这个问题而言,为了简单起见,我们假设我想获得进入时的开始时间,发送响应之前的结束时间,并将总时间添加到响应中.

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

谢谢Idob



更新:

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

message.setContextualProperty(key,value);
Run Code Online (Sandbox Code Playgroud)

但我得到的是NULL

message.getContextualProperty(key);
Run Code Online (Sandbox Code Playgroud)

我也尝试了同样但只是

message.put(key,value) and message.get(key)
Run Code Online (Sandbox Code Playgroud)

没用.

想法是谁?

谢谢,Idob

Ian*_*rts 27

您可以在上面存储值Exchange.CXF Exchange为每个请求创建一个对象,以充当请求/响应对的输入和输出消息的容器,并使其可以message.getExchange()从两者中访问.

在拦截器中:

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

拦截器

public void handleMessage(Message outMessage) throws Fault {
  MyCustomObject obj = (MyCustomObject)outMessage.getExchange().get("com.example.myKey");
}
Run Code Online (Sandbox Code Playgroud)

(反之亦然,对于客户端拦截器,out将存储值,in将检索它们).选择一个您知道不会被其他拦截器使用的密钥 - 包装限定名称是一个不错的选择.需要注意的是,像Message,ExchangeStringMap和有采取通用的PUT/GET方法Class为重点,让你编译时类型安全,节省您不必投:

theExchange.put(MyCustomObject.class, new MyCustomObject());
MyCustomObject myObj = theExchange.get(MyCustomObject.class);
Run Code Online (Sandbox Code Playgroud)

  • 不,每个_request_有一个`Exchange`.您需要选择一个其他拦截器不会用于同一请求的密钥,但您可以在一个请求中重复使用相同的密钥, (2认同)