2014-11-18 16 views
3

우리는 spring-ws 2.2.0을 사용하여 계약 우선 웹 서비스를 개발 중입니다. SoapHeader에있는 사용자 정의 태그 인 AuthToken을 사용하여 인증을 관리하려고합니다.엔드 포인트 메소드에서 Spring-ws SoapHeader 필드 액세스

<authToken> 
    <username>USERNAME</xa:username> 
    <password>PASSWORD</xa:password> 
</authToken> 

우리는 SOAPHeader에 내부의 지정된 사용자 정의 인증 태그를 포함하는 WSDL 스키마를 생성 할 수 있습니다 : AuthToken는 다음과 같은 구조를 가지고 있습니다. 문제는 클라이언트가 서버에 대한 호출을 수행 할 때 우리의 Ws 끝점 구현에서 AuthToken 태그 (SoapHeader에 있음)를 비 정렬화할 수 없다는 것입니다.

바인딩 메서드 서명 (아래 예제에 지정된 handleMethodRequest)의 @RequestPayload 주석을 사용하여 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, 우리는 다음과 같은 오류를 얻을 : 경우 3에서

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? 

, 4 우리는 오류가없는

우리는 사용자 이름과 암호 하위 요소를 검색하기 위해 AuthToken에 액세스하여 SoapHeader 또는 MessageContext (각각 3 및 4)를 처리 할 수 ​​없습니다.

웹에서 해결책을 찾기 위해 동일한 문제를 가진 많은 사람들이 스프링 인터셉터를 사용하여 인증을 처리한다는 것을 알았습니다. "Interceptors-way"다음에 우리는 인터셉터 내부의 AuthToken에 액세스해야합니다. 불행하게도 우리는 handleMethodRequest 메서드 내에서 AuthToken 필드를 다른 용도로 사용해야합니다 (예 : handleMethodRequest 외부에서 액세스 할 수없는 사용자 특정 데이터로드). 따라서 우리는 handleMethodRequest 방법 내에서 사용자 특정 데이터를 참조해야하므로이 방법을 사용할 수 없습니다.

누구든지 어떻게 문제를 해결할 수 있는지 알고 있습니까? 미리 감사드립니다.

답변

6

해당 사용 사례에 대해 주석 및 매개 변수 유형의 지원되는 유일한 조합은 @SoapHeaderSoapHeaderElement입니다. 현재 Spring-WS는 unmarshalling headers을 지원하지 않습니다.

+0

감사합니다. 제안한대로 클래스 유형을 변경 했으므로 작동합니다. SoapHeaderElement에서 가져온 Source를 사용하여 JAXB로 비 정렬 화합니다. – Tongo

+0

당신이 지적한 임무를 이해하지 못합니다. 왜이 문제에 대해 조치를 취하지 않습니까? – nolines

0

인터셉터에서 handleMethodRequest으로 값을 가져 오는 해킹 방법은 정적 인 ThreadLocal 인스턴스를 사용하고 있습니다. 또한 인터셉터를 호출 동일한 스레드가이 호출 때문에 handleMethodRequest 당신이

ThreadLocal.set(AuthToken); // in interceptor. 
ThreadLocal.get();// in handler and then clear it after use. 

을 사용할 수 있습니다 또한, 나는 당신의 예에서 @SoapHeader(value = "{authToken")}가없는 것으로 나타났습니다 오타 여기 또는 코드에서 그?