복붙노트

[SPRING] 스프링 WS 클라이언트는 SoapHeader를 추가합니다.

SPRING

스프링 WS 클라이언트는 SoapHeader를 추가합니다.

SOAP 헤더를 다음과 같이 SOAP 요청을 보내려고합니다.

<SOAP-ENV:Header>
<Security xmlns="http://www.xxx.org/xxx/2003/05">
<UsernameToken><Username>yyyy</Username><Password>xxx</Password>
</UsernameToken></Security></SOAP-ENV:Header>

이를 위해 SoapActionCallback을 사용하여 헤더 요소를 추가하고 있습니다.

SoapActionCallback actionCallBack = new SoapActionCallback("https://aaa.com/bbb.asmx") {
            public void doWithMessage(WebServiceMessage msg) {
                SoapMessage smsg = (SoapMessage) msg;
                smsg.setSoapAction("http://www.xxx.org/yyy/2003/05/SessionCreate");
                SoapHeaderElement security = smsg.getSoapHeader().addHeaderElement(new QName("http://www.xxx.org/yyy", "Security"));
                security.setText("<UsernameToken><Username>yyyy</Username><Password>xxx</Password></UsernameToken>");
            }
        };

내 문제는 비누 헤더가 이렇게 생겼어.

<SOAP-ENV:Header><Security xmlns="http://www.xxx.org/yyy/2003/05">&lt;UsernameToken&gt;&lt;Username&gt;yyyyy&lt;/Username&gt;&lt;Password&gt;xxxx&lt;/Password&gt;&lt;/UsernameToken&gt;</Security></SOAP-ENV:Header>

결과적으로 요청이 실패합니다.

이 메시지를 올바르게 추가하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.나는 똑같은 것을 원한다. 그러나, 내 자신의 검색에서 나타나는 것처럼, 봄에는 자바의 SOAPMessage와 같은 완전한 기능이 없다. 아마도 헤더에 addChildElement ()가 필요할 것입니다.

    나는 똑같은 것을 원한다. 그러나, 내 자신의 검색에서 나타나는 것처럼, 봄에는 자바의 SOAPMessage와 같은 완전한 기능이 없다. 아마도 헤더에 addChildElement ()가 필요할 것입니다.

    나는 SoapMessage 건물을 버리고 결국 이걸 가지고 갔다 :

    SOAPMessage message = MessageFactory.newInstance();
    private void buildHeader(String userName, String password) throws SOAPException{
        SOAPHeader header = message.getSOAPHeader();
        QName authHeader = new QName(SCHEMA, "AuthenticationHeader", SCHEMA_PREFIX);
        SOAPHeaderElement authElement = header.addHeaderElement(authHeader);
    
        QName userNameHeader = new QName(SCHEMA, "UserName", SCHEMA_PREFIX);
        SOAPElement userElement = authElement.addChildElement((userNameHeader));
        userElement.setTextContent(userName);
    
        QName passwordHeader = new QName(SCHEMA, "Password", SCHEMA_PREFIX);
        SOAPElement passwdElement = authElement.addChildElement(passwordHeader);
        passwdElement.setTextContent(password);
    
    
    }
    

    위의 접근 방식으로 sendSourceAndReceiveToResult를 사용하여 SOAPMessage를 전달하면 다른 봉투에 SOAPMessage가 래핑되고 이것이 우리가 원하는 것은 아니라는 점에 유의하십시오. :(

    업데이트 (2011 년 10 월 25 일) : 다른 솔루션에서이 솔루션을 발견했습니다. 조금 애매하지만 볼 가치가 있습니다. 나는 이것을 시험해 볼 것입니다. 동료 중 한 명이 스프링 통합을 시도해 보았고 Google에서 주제를 찾고 비누 헤더를 사용하여 유망한 자원을 얻었습니다.

    업데이트 (10/25/2013) : 라이브러리를 속여서 SOAPMessage를 Spring의 SoapMessage로 랩핑하는 더 빠른 방법이 있음을 발견했습니다.

    // message is a SOAPMessage object with custom headers
    SoapMessage soapMessage = new SaajSoapMessage(message);
    soapMessage.writeTo(System.out);
    

    아마도 soapmessage를 빌드 한 후에 spring-ws로 라우팅 할 수 있습니다.

  2. from https://stackoverflow.com/questions/19140265/spring-ws-client-add-soapheader by cc-by-sa and MIT license