On Wed, Jul 21, 2010 at 12:02, Cencio1980 <[email protected]> wrote:
> 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?

Yes, please create a JIRA issue and provide a self-contained test case
that reproduces the issue and that only uses the public Axiom API
(i.e. that doesn't use internal classes from the
org.apache.axiom.soap.impl.dom package).

>
> 2010/7/19 Cencio1980 <[email protected]>
>
>> 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 <[email protected]>
>>
>> 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 <[email protected]> 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 <[email protected]>
>>> >>
>>> >> 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 <[email protected]>
>>> 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