Доступ к полям Spring-ws SoapHeader в методе конечной точки
Мы разрабатываем первый в контракте WebService с использованием spring-ws 2.2.0. Мы пытаемся управлять аутентификацией, используя пользовательский тег с именем AuthToken
, расположенный в SoapHeader. AuthToken
имеет следующую структуру:
<authToken>
<username>USERNAME</xa:username>
<password>PASSWORD</xa:password>
</authToken>
Мы можем сгенерировать схему WSDL, содержащую указанный пользовательский тег аутентификации внутри SoapHeader. Проблема в том, что когда клиент выполняет вызов к нашему серверу, мы не можем разархивировать тег AuthToken (расположенный в SoapHeader) в нашей реализации Ws Endpoint.
С использованием @RequestPayload
аннотация в привязке метода подписи (handleMethodRequest
как указано в приведенном ниже примере), мы можем получить доступ к неупорядоченному контенту полезной нагрузки (расположенному в SoapBody). Мы пытались сделать то же самое с контентом SoapHeader, но безуспешно. В следующих примерах кода мы покажем вам, что мы хотели бы получить:
1
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "methodRequest")
@ResponsePayload
public MethodResponse handleMethodRequest(@RequestPayload MethodRequest request, @SoapHeader(value = "authToken") AuthToken authToken) { }
2
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "methodRequest")
@ResponsePayload
public MethodResponse handleMethodRequest(@RequestPayload MethodRequest request, AuthToken authToken) { }
3
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "methodRequest")
@ResponsePayload
public MethodResponse handleMethodRequest(@RequestPayload MethodRequest request, org.springframework.ws.soap.SoapHeader header) { }
4
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "methodRequest")
@ResponsePayload
public MethodResponse handleMethodRequest(@RequestPayload MethodRequest request, MessageContext messageContext) { }
В случаях 1, 2 мы получаем следующую ошибку:
No adapter for endpoint [MethodResponse EndpointImplementation.handleMethodRequest(MethodRequest, AuthToken) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
В случаях 3, 4 у нас нет ошибок, но мы не можем обработать SoapHeader или MessageContext (соответственно в случаях 3 и 4) для достижения наших целей, получая доступ к AuthToken
получить имя пользователя и пароль подэлемента.
Ища решение в сети, мы обнаружили, что многие люди, имеющие такую же проблему, используют Spring Interceptors для обработки аутентификации. Следуя "пути перехватчиков", мы должны получить доступ к AuthToken
внутри перехватчика. К сожалению, нам нужно использовать поле AuthToken внутри метода handleMethodRequest для других целей, например, для загрузки пользовательских данных, недоступных извне handleMethodRequest
, Поэтому мы не можем следовать этим путем, потому что нам нужно ссылаться на данные пользователя внутри handleMethodRequest
метод.
Кто-нибудь знает, как мы можем решить проблему? Заранее спасибо.
2 ответа
Для этого варианта использования единственная поддерживаемая комбинация аннотации и типа параметра @SoapHeader
а также SoapHeaderElement
, Spring-WS в настоящее время не поддерживает unmarshalling заголовки.
Хакерский способ получить значение от перехватчика до handleMethodRequest
использует статический ThreadLocal
пример. Поскольку тот же поток, который вызывает перехватчик, также вызывает handleMethodRequest
ты можешь использовать
ThreadLocal.set(AuthToken); // in interceptor.
ThreadLocal.get();// in handler and then clear it after use.
Также я заметил, что @SoapHeader(value = "{authToken")
в твоем примере нету }
это опечатка здесь или в вашем коде?