2017-09-20 10 views
0

私はベロシティテンプレートを使用してSOAPリクエストを作成します。 jax-wsフレームワークを使用してWebサービスクライアントを実装しています。 アウトバウンドメッセージを傍受するSOAP Handlerを配線しました。SOAPHandlerのSOAP要求からボディ要素を再配置する際のエラー

私はボディの内容を計算した新しいボディに置き換えようとしています。

私は私のハンドラに次のコードを使用します。

public boolean handleMessage(SOAPMessageContext context) { 

    boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
    try { 
     if (outbound) { 
      SOAPMessage msg = context.getMessage(); 
      SOAPPart sp = msg.getSOAPPart(); 
      SOAPEnvelope env = sp.getEnvelope(); 
      SOAPBody body = env.getBody(); 
      body.normalize(); 
      System.out.println(body.getValue()); 
      NodeList list = body.getElementsByTagName("template"); 
      if(list.getLength() > 0) { 
       Element template = (Element) list.item(0); 
       if (template != null) { 
        String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent()); 
        Document bodyElement = XmlUtils.getDocumentFromText(newBody); 
        body.removeContents(); 
        body.addDocument(bodyElement); 

私はそれを実行すると、私は次のエラーを取得する:

私はXMLテキスト内から本文の内容を変更するにはどうすればよい
org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces. 

あまりにも面倒なことなしに?

ありがとうございます!

答えて

0

私は解決策を見つけ出しました。

SOAPMessage msg = context.getMessage(); 
      SOAPPart sp = msg.getSOAPPart(); 
      SOAPEnvelope env = sp.getEnvelope(); 
      SOAPBody body = env.getBody(); 
      body.normalize(); 
      System.out.println(body.getValue()); 
      NodeList list = body.getElementsByTagName("template"); 
      if(list.getLength() > 0) { 
       Element template = (Element) list.item(0); 
       if (template != null) { 
        String newBody = StringEscapeUtils.unescapeHtml(template.getTextContent()); 
        Document bodyElement = XmlUtils.getBody(newBody); 
        body.removeContents(); 
        body.addDocument(bodyElement); 

さらに重要なことは、法のXmlUtils.getBody:

public static Document getBody(String fromText) { 
    Document result = null; 

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    try { 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     result = builder.parse(new ByteArrayInputStream(fromText.getBytes())); 
     NodeList list = result.getElementsByTagNameNS("soapenv", "Body"); 
     if(list.getLength() > 0) { 
      Node body = list.item(0); 
      result = builder.newDocument(); 
      result.adoptNode(body); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

私は当時発生した例外を説明する、実際に私の以前のコードでfactory.setNamespaceAware(true)一部であった。ここのコードです。

問題が解決しました。

関連する問題