11

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

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

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

谢谢伊多布



更新:

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

message.setContextualProperty(key,value);

但我得到 NULL

message.getContextualProperty(key);

我也尝试了同样的方法,但只是使用

message.put(key,value) and message.get(key)

没用。

有想法吗?

谢谢你,伊多布

4

2 回答 2

29

您可以将值存储在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 将检索它们)。选择一个您知道不会被其他拦截器使用的密钥 - 包限定名称是一个不错的选择。请注意,like Message, Exchangeis aStringMap并且具有以 a 为键的通用 put/get 方法,这些方法Class为您提供编译时类型安全性并节省您必须转换的时间:

theExchange.put(MyCustomObject.class, new MyCustomObject());
MyCustomObject myObj = theExchange.get(MyCustomObject.class);
于 2012-10-02T12:50:32.813 回答
1

您的拦截器可以访问javax.xml.ws.handler.MessageContext. 这 extends Map<String,Object>,因此您可以将任何您想要的内容放入上下文并稍后在请求中访问它:

public boolean handleMessage(final MessageContext context) {
    context.put("my-key", myCustomObject);
            // do whatever else your interceptor does
}

稍后的:

public boolean handleMessage(final MessageContext context) {
    MyCustomObject myCustomObject = context.get("my-key");
            // do whatever else your interceptor does
}
于 2012-10-02T10:03:13.760 回答