복붙노트

[SPRING] org.springframework.ws.WebServiceMessage에 SoapHeader를 추가하십시오.

SPRING

org.springframework.ws.WebServiceMessage에 SoapHeader를 추가하십시오.

어떻게 org.springframework.ws.WebServiceMessage의 비누 헤더에 객체를 추가 할 수 있습니까?

이것은 제가 끝내기 위해 찾고있는 구조입니다 :

 <soap:Header>
    <credentials xmlns="http://example.com/auth">
      <username>username</username>
      <password>password</password>
    </credentials>
  </soap:Header>

해결법

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

    1.기본적으로 클라이언트에서 WebServiceMessageCallback을 사용하여 메시지를 작성한 후 전송하기 전에 수정해야합니다. 코드의 나머지 부분은 @skaffman에 의해 매우 정확하게 설명되었으므로 전체 내용이 다음과 같이 보일 수 있습니다.

    기본적으로 클라이언트에서 WebServiceMessageCallback을 사용하여 메시지를 작성한 후 전송하기 전에 수정해야합니다. 코드의 나머지 부분은 @skaffman에 의해 매우 정확하게 설명되었으므로 전체 내용이 다음과 같이 보일 수 있습니다.

    public void marshalWithSoapActionHeader(MyObject o) {
    
        webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() {
    
            public void doWithMessage(WebServiceMessage message) {
                try {
                    SoapMessage soapMessage = (SoapMessage)message;
                    SoapHeader header = soapMessage.getSoapHeader();
                    StringSource headerSource = new StringSource("<credentials xmlns=\"http://example.com/auth\">\n +
                            <username>"+username+"</username>\n +
                            <password>"+password"+</password>\n +
                            </credentials>");
                    Transformer transformer = TransformerFactory.newInstance().newTransformer();
                    transformer.transform(headerSource, header.getResult());
                } catch (Exception e) {
                    // exception handling
                }
            }
        });
    }
    

    개인적으로, 나는 Spring-WS가 그런 기본적인 필요를 위해 열심히 열중하고, SWS-479를 고쳐야한다는 것을 발견했다.

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

    2.당신은 아래와 같이 할 수 있습니다 :

    당신은 아래와 같이 할 수 있습니다 :

    public class SoapRequestHeaderModifier implements WebServiceMessageCallback {
     private final String userName = "user";
     private final String passWd = "passwd";
    
     @Override
     public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
      if (message instanceof SaajSoapMessage) {
       SaajSoapMessage soapMessage = (SaajSoapMessage) message;
       MimeHeaders mimeHeader = soapMessage.getSaajMessage().getMimeHeaders();
       mimeHeader.setHeader("Authorization", getB64Auth(userName, passWd));
      }
     }
    
     private String getB64Auth(String login, String pass) {
      String source = login + ":" + pass;
      String retunVal = "Basic " + Base64.getUrlEncoder().encodeToString(source.getBytes());
      return retunVal;
     }
    }
    

    그때

    Object response = getWebServiceTemplate().marshalSendAndReceive(request, new SoapRequestHeaderModifier());
    
  3. ==============================

    3.WebServiceMessage를 헤더를 수정하는 데 사용할 수있는 getSoapHeader () 메서드가있는 SoapMessage로 캐스팅해야합니다. 차례로 SoapHeader에는 getResult () (Transformer.transform () 작업의 출력으로 사용될 수 있음)를 비롯한 다양한 요소 추가 메서드가 있습니다.

    WebServiceMessage를 헤더를 수정하는 데 사용할 수있는 getSoapHeader () 메서드가있는 SoapMessage로 캐스팅해야합니다. 차례로 SoapHeader에는 getResult () (Transformer.transform () 작업의 출력으로 사용될 수 있음)를 비롯한 다양한 요소 추가 메서드가 있습니다.

  4. from https://stackoverflow.com/questions/2274378/add-soapheader-to-org-springframework-ws-webservicemessage by cc-by-sa and MIT license