복붙노트

[SPRING] Java의 SOAP 헤더에 자식 요소를 추가하는 방법

SPRING

Java의 SOAP 헤더에 자식 요소를 추가하는 방법

자바 스프링 웹 서비스에서 SOAP 헤더에 자식 요소를 추가하는 방법

나는 두 가지 접근법을 시도했지만 아무것도 효과가 없다.

첫 번째 접근법 :-

soapHeaderString.append("<tem:Culture>en_Us</tem:Culture><tem:AgentCode>PumpkinSafari</tem:AgentCode><tem:PartnerID></tem:PartnerID><tem:Password>PMP22#in</tem:Password>");

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// Here we create a Source Tree
StringSource stringSource = new StringSource(soapHeaderString.toString());
transformer.transform(stringSource, soapHeader.getResult());

하지만 그것은 나에게 오류를주고있다

The prefix "tem" for element "tem:Culture" is not bound.

두 번째 접근법 :-

SoapHeaderElement headerElement=soapMessage.getSoapHeader().addHeaderElement(new QName("http://tempuri.org/", "SOAPHeaderAuth","tem"));
headerElement.setText(soapHeaderString.toString());

이스케이프 처리되지 않은 시퀀스를 생성하므로 서비스 공급자가 요청을 이해할 수 없어 오류가 발생합니다.

문제를 해결하기 위해해야 ​​할 일을 도와주세요.

해결법

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

    1.예, 제 경우에도 같은 오류가 발생합니다. "wsse : username"요소의 접두사 "username"이 바인딩되지 않았습니다. 네임 스페이스 선언을 추가하기 위해 모든 것을 시도했습니다. 그러나 작동하지 않습니다!

    예, 제 경우에도 같은 오류가 발생합니다. "wsse : username"요소의 접두사 "username"이 바인딩되지 않았습니다. 네임 스페이스 선언을 추가하기 위해 모든 것을 시도했습니다. 그러나 작동하지 않습니다!

    "마침내", 나는 지난 밤에 해결 방법으로 스프링 org.springframework.ws.soap.SoapHeader에서 javax.xml.soap.SOAPHeader로 변환 할 수있었습니다. 그리고 지금은 문제가 없습니다!

    SOAPMessage soapMessage = ((SaajSoapMessage) message).getSaajMessage();
    SOAPHeader header = soapMessage.getSOAPHeader();
    SOAPHeaderElement security = header.addHeaderElement(new QName(SCHEMA, "Security", SCHEMA_PREFIX));
    SOAPElement usernameToken = security.addChildElement("UsernameToken", SCHEMA_PREFIX);
    SOAPElement usernameElement = usernameToken.addChildElement("Username", SCHEMA_PREFIX);
    SOAPElement passwordElement = usernameToken.addChildElement("Password", SCHEMA_PREFIX);
    
    usernameElement.setTextContent(username);
    passwordElement.setTextContent(password);
    

    이를 통해 스프링 비누 헤더 자식 요소에 네임 스페이스 선언을 추가 할 수있었습니다!

  2. ==============================

    2.JAX-WS 사용자

    JAX-WS 사용자

    메시지 처리기를 사용하는 것이 좋습니다.

    http://www.javadb.com/using-a-message-handler-to-alter-the-soap-header-in-a-web-service-client

    스프링 웹 서비스 사용자

    비슷한 개념이 있습니다.

    http://arcanetechnotes.blogspot.com/2008/12/modifying-soap-headers-with-spring-web.html

    이 질문은 tem 네임 스페이스를 이해할 수 없으므로 네임 스페이스를 헤더에 등록 할 수 있습니다.

    soapHeader.addNamespaceDeclaration("tem", "http://whatever.namespace.com/");
    
  3. ==============================

    3.webparam에서 "header = true"속성 사용 처럼

    webparam에서 "header = true"속성 사용 처럼

    @WebMethod(operationName = "someMethod")
        public String someMethod(@WebParam(name = "yourBeanObj") YourBeanObjClass yourBeanObj,
                @WebParam(header = true, mode = WebParam.Mode.IN, name = "username") String userName,
                @WebParam(header = true, mode = WebParam.Mode.IN, name = "password") String pwd) {
    //todo stuff
    }
    

    위의 예에 따라 "yourBeanObj"는 soap body에 추가되고 "username"및 "password"는 soap header에 추가됩니다.

  4. from https://stackoverflow.com/questions/16322634/how-to-add-child-element-in-soap-header-in-java by cc-by-sa and MIT license