代码之家  ›  专栏  ›  技术社区  ›  Mark Pope

将soapheader添加到org.springframework.ws.webserviceMessage

  •  13
  • Mark Pope  · 技术社区  · 15 年前

    如何将对象添加到 org.springframework.ws.WebServiceMessage

    这就是我想要的结构:

     <soap:Header>
        <credentials xmlns="http://example.com/auth">
          <username>username</username>
          <password>password</password>
        </credentials>
      </soap:Header>
    
    3 回复  |  直到 7 年前
        1
  •  28
  •   Brian    7 年前

    基本上,你需要使用 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
  •  5
  •   Johan B    9 年前

    您可以执行以下操作:

    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
  •   skaffman    15 年前

    你需要把 WebServiceMessage SoapMessage ,它有一个 getSoapHeader() 可用于修改标题的方法。反过来, SoapHeader 有多种添加元素的方法,包括 getResult() (可以用作 Transformer.transform() 操作)。