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
}