우리는 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
방법 내에서 사용자 특정 데이터를 참조해야하므로이 방법을 사용할 수 없습니다.
누구든지 어떻게 문제를 해결할 수 있는지 알고 있습니까? 미리 감사드립니다.
감사합니다. 제안한대로 클래스 유형을 변경 했으므로 작동합니다. SoapHeaderElement에서 가져온 Source를 사용하여 JAXB로 비 정렬 화합니다. – Tongo
당신이 지적한 임무를 이해하지 못합니다. 왜이 문제에 대해 조치를 취하지 않습니까? – nolines