2017-01-12 8 views
0

作成されたXMLが標準に準拠していないのはなぜですか?

http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html

SOAPMessage message = messageFactory.createMessage(); 
SOAPHeader header = message.getSOAPHeader(); 
SOAPBody body = message.getSOAPBody(); 

によると、ここで、それが生成するXMLです:

<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
    ... 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

しかし、私の実装は<SOAP-ENV:Header/>タグなし

<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
    ... 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

のようなXMLコードを生成します。空でも明示的にヘッダタグが必要です。どのようにしてそのようなXMLを生成できますか?ここで

は私のコード、私は私のコンソール上でそれを印刷する

ByteArrayOutputStream in = new ByteArrayOutputStream(); 
request.writeTo(in); 
logger.debug("Sending: " + in); 

を使用

MessageFactory messageFactory = MessageFactory.newInstance(); 
SOAPMessage message = messageFactory.createMessage(); 
SOAPHeader header = message.getSOAPHeader(); 



marshaller.marshal(someObject, message.getSOAPBody()); 
message.saveChanges(); 
return message; //save it as request. for printing in logs 

です。

+1

ヘッダーはオプションでオプションです。あなたが必要とするならば、あなたは空白でないスペースや他のものをそこに置く必要があります。 – stdunbar

+0

あなたはそれを答えとしてどうやって説明できますか? @stdunbar –

答えて

0

さて、私はあなたが見ているものを再現することができません。私はSAAJ 1.3.28を使用しています。私のコードは以下のようになります。ヘッダーに何も付かずにSOAPヘッダを取得しているのが分かります。私のコメントが間違っていたので、私は明らかにこれをやっていないのは明らかです。私はSOAPメッセージを2つの異なる方法で出力し、両方の方法でヘッダーを表示します。 SAAJのどのバージョンを使用していますか?

参考までに、私の2番目のメッセージ印刷方法はthis stackoverflow postです。

package com.hotjoe.stuff; 


import java.io.ByteArrayOutputStream; 
import java.io.IOException; 

import javax.xml.namespace.QName; 
import javax.xml.soap.MessageFactory; 
import javax.xml.soap.SOAPBody; 
import javax.xml.soap.SOAPBodyElement; 
import javax.xml.soap.SOAPElement; 
import javax.xml.soap.SOAPException; 
import javax.xml.soap.SOAPMessage; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.TransformerFactoryConfigurationError; 
import javax.xml.transform.stream.StreamResult; 

public class MessageCreator { 

    public static void main(String[] argv) { 
     try { 
      MessageFactory factory = MessageFactory.newInstance(); 
      SOAPMessage message = factory.createMessage(); 

      SOAPBody body = message.getSOAPBody(); 
      QName bodyName = new QName("http://wombat.ztrade.com", "GetLastTradePrice", "m"); 
      SOAPBodyElement bodyElement = body.addBodyElement(bodyName); 

      QName name = new QName("symbol"); 
      SOAPElement symbol = bodyElement.addChildElement(name); 
      symbol.addTextNode("SUNW"); 

//   SOAPHeader header = message.getSOAPHeader(); 
//   QName headerName = new QName("http://wombat.ztrade.com","headerItem", "m"); 
//   header.addHeaderElement(headerName); 

      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      message.writeTo(out); 
      String strMsg = new String(out.toByteArray()); 

      System.out.println("message is " + strMsg); 

      System.out.println("or another way " + printSoapMessage(message)); 
     } 
     catch(SOAPException | IOException | TransformerException se) { 
      se.printStackTrace(); 
     } 
    } 

    public static String printSoapMessage(final SOAPMessage soapMessage) throws TransformerFactoryConfigurationError, 
      SOAPException, TransformerException 
    { 
     final TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     final Transformer transformer = transformerFactory.newTransformer(); 

     // Format it 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 

     final Source soapContent = soapMessage.getSOAPPart().getContent(); 

     final ByteArrayOutputStream streamOut = new ByteArrayOutputStream(); 
     final StreamResult result = new StreamResult(streamOut); 
     transformer.transform(soapContent, result); 

     return streamOut.toString(); 
    } 
} 
関連する問題