Thanks Anand,
I really appreciate your help, and thankyou for supplying your source
code. It was very kind.
I was infact trying a similar method too, although I need to process my
outgoing request, which I accessed using either:
SOAPEnvelope currentEnvelope =
msgContext.getCurrentMessage().getSOAPEnvelope();
or
SOAPEnvelope requestEnvelope =
msgContext.getRequestMessage().getSOAPEnvelope();
The problem occurs when manipulating the DOM however, when I call
'getElementsByTagName(str)' with a label I know exists, or even
'getChildren()' recursively on nodes I can only decend two levels into
my DOM based message structure before I start obtaining nulls for
subsequent children. When I run it in a debugger I can see my data
wrapped in a 'RPCParam' element a few nodes down, and can even
'getAsString()' but I cannot manipulate it any further using the DOM. I
can process the 'getAsString()' output to remove the required elements
but when I try to set it using the 'rpcParam.setValue(processedStr)'
method, my "<" and ">" tag markers (the one of elements that cant be
accessed with the DOM programatically) get converted to "<" and
">" respectively which obviously screws the xml.
Have I made a mistake further up in my methodology? Wrong WSDL2Java
options, or their schema is broken in a way that somehow causes this
strange DOM behaviour (ie 2 nodes of DOM, and the rest hidden in an
element that returns null when asking for all children - even though
they are displayed in the debugger)?
Am I being a n00b? I dont know a lot about SOAP/RPC/etc (hence using the
Axis framework), and so I dont know why I cant access these elements
programatically. All I want to do is strip out the nillable elements!
Why doesnt setting "nilable="false" and/or minOccurs="0" in the WSDL
stop Axis sending these elements?
Anyway, thankyou for your help and especially your code. Glad to know I
was not being stupid (I hope!)
Sorry to everyone else for bombing the list so much... I am going nuts!
I dont wanna try and hack the HTTPSender class!
Thanks
Tim
Kasi, Anand wrote:
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).
>>
>>
>
>
>