Apache CXF: пересылка информации от перехватчика к реальной реализации веб-сервиса - PullRequest
0 голосов
/ 24 января 2012

Я использую веб-сервис JAX-WS, основанный на Apache CXF 2.3.1, на сервере JBoss6.

Мой сервис предлагает функцию getWeight.Эта функция должна возвращать значения в разных единицах (килограммах, фунтах) в зависимости от дополнительной информации в заголовке SOAP.Для этого я добавил свой собственный перехватчик:

public class MySoapHeaderInterceptor extends AbstractSoapInterceptor
{
    public MySoapHeaderInterceptor()
    {
        super(Phase.USER_PROTOCOL);
    }

    ...
}

Перехват работает нормально, и я могу проанализировать дополнительный элемент из заголовка SOAP и установить переменную на основе этого элемента:

boolean poundsRequested = true;

Теперь моя проблема возникает.Я не знаю, как переслать переменную poundsRequested в мою фактическую реализацию WebService MyServiceImpl.Этот класс вызывает другой класс ValueReader, где мне, наконец, нужна информация из заголовка SOAP.

Я уже пытался настроить глобальную статическую переменную ValueReader.poundsRequested.Но такое решение не является потокобезопасным.Может случиться так, что вызовы двух клиентов мешают друг другу и могут перезаписать друг друга для установки переменной.

Подводя итог : мне в основном нужна возможность переслать переменную из перехватчика Apache CXFк фактической реализации веб-сервиса.Более того, значение этой переменной должно быть уникальным для каждого запроса.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

В перехватчике вы можете сохранить нужные значения во входящем сообщении:

message.put("my.value", value);

Внутри вашей реализации вы можете сделать одну из двух вещей:

1)стандартный JAXWS WebServiceContext, внедренный через штуку @Resource и вызывающий

context.getMessageContext().get("my.value");

2) Поскольку вы все равно привязаны к CXF, выполните:

PhaseInterceptorChain.getCurrentMessage().get("my.value");
0 голосов
/ 24 января 2012

В идеале формат, в котором запрашиваются веса, должен быть частью вашей полезной нагрузки - для него не имеет смысла быть заголовком.

Вам может не понадобиться перехватчик для получения этогозаголовок, если вы используете JAX-WS (рекомендуется с CXF), вы можете добраться до этого, используя @ WebParam аннотацию с атрибутом заголовка, установленным в true.

...