Ok, i found th solution....

I checked the AXIS2's SAAJ implementation and i copy the
SOAPEnvelope.addHeader()
method:

public SOAPHeader addHeader() throws SOAPException {
  org.apache.axiom.soap.SOAPHeader header = omSOAPEnvelope.getHeader();
  if (header == null) {
    ...
    header = new
SOAP11HeaderImpl(omSOAPEnvelope,(SOAPFactory)this.element.getOMFactory());
    saajSOAPHeader = new SOAPHeaderImpl(header);
    saajSOAPHeader.setParentElement(this);
    ....
    ((NodeImpl)omSOAPEnvelope.getHeader()).setUserData(SAAJ_NODE,
saajSOAPHeader, null);
    }
  ...
}

This still give null on omSOAPEnvelope.getHeader().
Debugging this code i found that the Header element is created after the
Body Element, and not as first Envelope's child. So i fixed it adding those
lines:

NodeImpl body = (NodeImpl)omSOAPEnvelope.getFirstChild();
omSOAPEnvelope.setLastChild(body);
omSOAPEnvelope.setFirstChild(header);
((NodeImpl)omSOAPEnvelope.getHeader()).setNextOMSibling(body);

and now it works!!

Should i have to open a bug?


2010/7/19 Cencio1980 <cencio1...@gmail.com>

> There is no difference, but i tryed calling
>
> hdr = ((org.apache.axiom.soap.SOAPFactory)
> soapMessage.getSOAPEnvelope().getOMFactory()).createSOAPHeader(soapMessage.getSOAPEnvelope());
>
> as in the sample included in my last mail, with same result.
>
>
> 2010/7/16 Andreas Veithen <andreas.veit...@gmail.com>
>
> You should not use the SOAP11HeaderImpl constructor directly, but
>> instead use the corresponding method on SOAPFactory. Maybe that's the
>> cause of the issue.
>>
>> Andreas
>>
>> On Fri, Jul 16, 2010 at 11:24, Cencio1980 <cencio1...@gmail.com> wrote:
>> > Hi Andreas,
>> >
>> > i found that i was using a wrong way to add HeaderBlocks. Now, when i
>> add
>> > them to an existing SOAPHeader it works fine.
>> >
>> > Still remain the problems when the Envelope hasn't a Header.
>> >
>> > I create a new one with
>> > new SOAP11HeaderImpl(
>> > soapMessage.getSOAPEnvelope(),
>> > (org.apache.axiom.soap.SOAPFactory)
>> > soapMessage.getSOAPEnvelope().getOMFactory());
>> >
>> > I can serialize the returned SOAPHeader as many time i want, but if i
>> try to
>> > get it from the envelope:
>> > soapMessage.getSOAPEnvelope().getHeader()
>> > it's null, and if i serialize the envelope, it will not appear.
>> >
>> > Seems i create it, but without attaching it to the envelope.
>> > I checked the axiom source code, but i didn't find where the new
>> SOAPHeader
>> > is setted as envelope's first children....
>> >
>> > Before opening a Jira, i want to be sure that i'm using the api in the
>> right
>> > way.
>> >
>> > Thanks for any help,
>> > Lorenzo
>> >
>> > P.S.
>> > In attachment a simple test case (look at README).
>> > I tryed with axiom 1.2.8 and 1.2.9 on java 1.5
>> >
>> >
>> >
>> > 2010/7/14 Andreas Veithen <andreas.veit...@gmail.com>
>> >>
>> >> Hi Lorenzo,
>> >>
>> >> Can you please open a JIRA issue [1] for this problem with the
>> >> following additional information:
>> >>
>> >> * The Axiom version you are using.
>> >> * A test case that reproduces the problem.
>> >>
>> >> Thanks,
>> >>
>> >> Andreas
>> >>
>> >> [1] https://issues.apache.org/jira/browse/WSCOMMONS
>> >>
>> >> On Wed, Jul 14, 2010 at 17:29, Cencio1980 <cencio1...@gmail.com>
>> wrote:
>> >> > Hi all,
>> >> >
>> >> > i have a servlet that works on SOAP 1.1 Message , but usually doesn't
>> >> > need
>> >> > to access to soap:Body content.
>> >> > i obtain an org.apache.axiom.soap.impl.dom.SOAPMessageImpl in this
>> way:
>> >> >
>> >> > XMLStreamReader xmlStreamReader =
>> >> >
>> >> >
>> XMLInputFactory.newInstance().createXMLStreamReader(((HttpServletRequest)
>> >> > req).getInputStream());
>> >> >  org.apache.axiom.soap.SOAPFactory mf = new
>> >> > org.apache.axiom.soap.impl.dom.soap11.SOAP11Factory();
>> >> > org.apache.axiom.om.OMXMLParserWrapper parser = new
>> >> > StAXSOAPModelBuilder(xmlStreamReader,mf,null);
>> >> > org.apache.axiom.soap.impl.dom.SOAPMessageImpl soapMessage =
>> >> > (org.apache.axiom.soap.impl.dom.SOAPMessageImpl)
>> >> > ((StAXSOAPModelBuilder)parser).getSoapMessage();
>> >> >
>> >> > then i tryed to add an HeaderBlock, but if i call method serialize()
>> on
>> >> > the
>> >> > header several times, only first time i can see new HeaderBlock, then
>> >> > i'll
>> >> > loose it.
>> >> >
>> >> > After some tests i'll find that if i call build() method on the
>> header
>> >> > element:
>> >> > soapMessage.getEnvelope().getHeader().build()
>> >> > and i add new HeaderBlock, i can serialize the message header many
>> times
>> >> > without loosing new added HeaderBlock elements and without building
>> the
>> >> > message Body using very few memory.
>> >> >
>> >> > Now the problem: what if the message hasn't the Header element?
>> >> > soapMessage.getEnvelope().getHeader() is null
>> >> > I have to add a new Header, but if i don't call the build() on the
>> >> > Envelope
>> >> > i'll loose it first time i serialize it and if i build the envelope,
>> >> > i'll
>> >> > build also the Body with a huge memory load.
>> >> >
>> >> > There is a solution without building the entire soap:Body element?
>> >> >
>> >> > Thanks in advance for any help,
>> >> >
>> >> > - Lorenzo
>> >> >
>> >
>> >
>>
>
>

Reply via email to