Tim,
 
   I have pasted some code to help guide you. Do the same where you have access 
to your MessageContext object in your class that extends the 
   BasicHandler interface. 
 
Anand

  Message response = msg.getResponseMessage();
  SOAPEnvelope responseEnvelope = response.getSOAPEnvelope();
  SOAPEnvelope requestEnvelope = msg.getRequestMessage().getSOAPEnvelope();
  java.util.Vector v = responseEnvelope.getBodyElements();

  Iterator it = v.iterator();
 
  while (it.hasNext())
  {
   SOAPBodyElement sbe = (SOAPBodyElement) it.next();
   NodeList nodes = doc.getElementsByTagName("NodeNameYouWantToRemove");
   if (nodes != null && nodes.getLength() > 0)
   {
             removeAll(doc, Node.ELEMENT_NODE, "NodeNameYouWantToRemove");  // 
removeAll method defined below
             responseEnvelope.removeBodyElement(sbe);  // removing 
soapBodyElement from responseEnvelope
             SOAPBodyElement newBody = new 
SOAPBodyElement(doc.getDocumentElement()); // create soapBody from transformed 
doc object 
              responseEnvelope.addBodyElement(newBody);  // Add new soap body 
to responseEnvelope
   }
 
  }
  

  //A generic removeAll method 
 public static void removeAll(Node node, short nodeType, String name) 
 {
   if (node.getNodeType() == nodeType &&
     (name == null || node.getNodeName().equals(name))) 
   {
    node.getParentNode().removeChild(node);
   } 
   else 
   {
    // Visit the children
    NodeList list = node.getChildNodes();
    for (int i=0; i<list.getLength(); i++) 
    {
     removeAll(list.item(i), nodeType, name);
    }
   }
  }


________________________________

From: Tim R J Langford [mailto:[EMAIL PROTECTED]
Sent: Thu 2/16/2006 4:37 AM
To: axis-user@ws.apache.org
Subject: Re: How to not send nillable="true" for null elements in a SOAP message



Thanks Kasi,

OK I am trying thsi approach now as it si my final option.

I have created a handler class that extend BasicHandler and have
attached it to my outgoing Request SimpleChain in my
EngineConfiguration. I can grab the message context and display it as a
string. I also have access to the DOM and the various RPC elements, but
it is becoming fairly complicated and bespoke to try and remove these
nil elements. Is there any simple way of getting the string, processing
it to remove the elements and setting my desired string back again at
this level?

Thanks for your time,

Tim



Kasi, Anand wrote:

>Write up a response flow handler that gets the response message from the
>MessageContext object and removes the xsi:nil = true elements.
>
>
>-----Original Message-----
>From: Tim R J Langford [mailto:[EMAIL PROTECTED]
>Sent: Wednesday, February 15, 2006 9:42 AM
>To: axis-user@ws.apache.org
>Subject: Re: How to not send nillable="true" for null elements in a SOAP
>message
>
>Hello All,
>
>I am still trying to remove 'nil="true"' elements from my messages sent
>out by axis. I have modified the wsdl in elements where I want axis not
>to send these strings (i.e: have a "blank" element) as follows :
>
><element name="sendNothingIfNull" nillable="true" type="xsd:string"/>
>
>to :
>
><element name="sendNothingIfNull" nillable="false" minOccurs="0"
>type="xsd:string"/>
>
>so that instead of sending :
>
><someXML>
>    <sendNothingIfNull xsi:type="xsd:string" xsi:nil="true"/>
></someXML>
>
>I send something like :
>
><someXML></someXML>
>
>
>I have tried a few other methods (such as the one Rod suggested not
>specifying "nillable" at all in the schema and setting minOccurs="0")
>but axis keeps sending these elements as nillable. Should this work or
>am I making a mistake somwhere?
>
>It may be PEBCAK but I just cant get axis1.3  to exhibit the behavior
>the server expects. Is there any other lower level method in axis to
>deal with this? (I traced the code calls down to the HTTP sender class
>but even at this level there is no easy access to the string as it is
>being passed by chunk encoded HTTP - and of course in some cases the
>server we are trying to attach too actually wants us to send these
>nillable="true" elements so this approach is not suitable).
>
>I know I must have exhausted all you guys by now! Sorry, and thanks.
>
>
>Tim
>
>PS: I am generating the axis code form the wsdl using the following ant
>task configuration :
>
>        <axis-wsdl2java
>              output="${src.dir}"
>              deployScope="Application"
>              verbose="true"
>              serverSide="true"
>             wrapArrays="true"
>              url="eurostar_hack2.wsdl">      
>        </axis-wsdl2java>
>
>
>
>
>
>
>
>Rodrigo Ruiz wrote:
>
> 
>
>>By what you describe, I think you should add minOccurs='0' and remove
>>nillable='true'
>>
>>Regards,
>>Rodrigo Ruiz
>>
>>Tim R J Langford wrote:
>>
>>   
>>
>>>Thanks Anne,
>>>
>>>Thats what I thought. Unfortunatly our provider does not seem too
>>>clued up on their tech, and the wsdl does not allow minOccurs="0".  I
>>>     
>>>
>
> 
>
>>>guess I will have to update our automated build process to fix their
>>>schema before generating my soap beans and classes. The best way to
>>>do this would be by adding minOccurs="0" to the faulty elements I
>>>presume?
>>>
>>>Thanks to everybody for their time,
>>>
>>>Tim
>>>
>>>
>>>Anne Thomas Manes wrote:
>>>
>>>     
>>>
>>>>If the service cannot accept xsi:nil="true" then the service
>>>>provider should adjust the schema accordingly. Does the schema allow
>>>>       
>>>>
>
> 
>
>>>>minOccurs="0"? If not, then there's no valid way to send no element
>>>>instead of xsi:nil="true".
>>>>
>>>>Anne
>>>>
>>>>On 2/14/06, *Tim R J Langford* <[EMAIL PROTECTED]
>>>><mailto:[EMAIL PROTECTED]>> wrote:
>>>>
>>>>
>>>>    Hi Jeff,
>>>>
>>>>    Thanks for your response.
>>>>
>>>>    Sorry for being unclear. Yes you are correct. I am sending
>>>>    'xsi:nil="true"' and I want to configure axis to send  nothing
>>>>instead
>>>>    of this string.  e.g : *
>>>>
>>>>    <XXX* xsi:type="xsd:string" xsi:nil="true"/>*
>>>>    <YYY* xsi:type="zzz:YYY" xsi:nil="true" xmlns:zzz="KKK"*/>
>>>>
>>>>    *I think Axis 1.2 did it this way? Is there anyway of
>>>>       
>>>>
>configuring
> 
>
>>>>    Axis
>>>>    1.3 to not send these 'xsi:nil="true"' elements?
>>>>
>>>>    Thanks for you time,
>>>>
>>>>    Tim
>>>>
>>>>
>>>>    PS: The service wsdl does have  'xsd:nillable="true"' elements
>>>>in the
>>>>    message schema, but their system cannot actually handle the
>>>>situation
>>>>    where it is null (even if they return it in a response), and
>>>>they have
>>>>    asked us to remove the 'xsi:nil="true"' elements from our
>>>>requests. We
>>>>    could fix the wsdl schema, but this would impede our codegen
>>>>    system as
>>>>    we are the client, so were wondering if there was a way to do it
>>>>       
>>>>
>
> 
>
>>>>from
>>>>    within axis?*
>>>>
>>>>
>>>>
>>>>    *
>>>>
>>>>    Jeff Greif wrote:
>>>>
>>>>    >Just to be sure, you're sending xsi:nil="true", not
>>>>    xsd:nillable="true", right?
>>>>    >
>>>>    >The latter is used only in the schema, and means that the
>>>>element is
>>>>    >allowed to have no content.  The former means that this
>>>>    particular use
>>>>    >of the element has no content.
>>>>    >
>>>>    >Jeff
>>>>    >
>>>>    >On 2/14/06, Tim R J Langford <[EMAIL PROTECTED]
>>>>    <mailto:[EMAIL PROTECTED]>> wrote:
>>>>    >
>>>>    >
>>>>    >>Hello All,
>>>>    >>
>>>>    >>I am writing a client interface into a provider SOAP web
>>>>    service, and
>>>>    >>their system fails and returns a null pointer exception when I
>>>>    send them
>>>>    >>a 'nillable="true"' element in my request. I think the reason
>>>>    for this
>>>>    >>is that they are using an older version of axis than we are
>>>>    using ( 1.3).
>>>>    >>
>>>>    >>
>>>>    >
>>>>    >
>>>>    >
>>>>
>>>>
>>>>       
>>>>
>>>
>>>     
>>>
>
> 
>

Reply via email to