Apache CXF - обмен данными между перехватчиками In и Out

Я использую Apach CXF в качестве поставщика REST.

Я хочу собирать данные, когда я вхожу в веб-сервис, собираю данные, прежде чем я войду в resposne и добавлю некоторые вычисления в ответ. По этому вопросу и для простоты предположим, что я хочу получить начальное время при входе, время окончания до отправки ответа и добавить общее время ответа.

Теперь, как мне это сделать? Я создал перехватчики In и Out, которые работают отлично в одиночку, но как я могу использовать данные из перехватчика In в перехватчике Out?

Спасибо Idob



UPDATE:

Я попытался установить данные в качестве контекстного параметра с помощью

message.setContextualProperty(key,value);

но я получаю NULL на

message.getContextualProperty(key);

Я тоже пробовал то же самое, но только с

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

не работает.

Идея кто-нибудь?

Спасибо, Idob

Ответ 1

Вы можете сохранить значения на 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 будет их извлекать). Выберите ключ, который, как вы знаете, не будет использоваться другими перехватчиками - подходящее имя пакета является хорошим выбором. Обратите внимание, что, как Message, Exchange является StringMap и имеет общие методы put/get, принимающие Class в качестве ключа, который дает вам безопасность типа времени компиляции и сохраняет вас при создании:

theExchange.put(MyCustomObject.class, new MyCustomObject());
MyCustomObject myObj = theExchange.get(MyCustomObject.class);

Ответ 2

Ваши перехватчики имеют доступ к javax.xml.ws.handler.MessageContext. Это расширяет 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
}