That's what I feared.  Thanks.

On 6/26/05, Anne Thomas Manes <[EMAIL PROTECTED]> wrote:
> Paul,
> 
> Unfortunately, there is no easier way. Your service is obviously not
> WS-compliant if it places unreasonable constraints on the structure of
> the message, such as use of namespace prefixes.
> 
> Given these constraints, the only option you have it to create the
> message by hand.
> 
> Anne
> 
> On 6/25/05, Paul Barry <[EMAIL PROTECTED]> wrote:
> > I can get what I need building the SOAP XML message with JDOM first
> > and then wrapping it in a SOAPEnvelope object like this:
> >
> >     import java.io.ByteArrayInputStream;
> >
> >     import org.apache.axis.message.SOAPEnvelope;
> >     import org.jdom.Document;
> >     import org.jdom.Element;
> >     import org.jdom.Namespace;
> >     import org.jdom.output.Format;
> >     import org.jdom.output.XMLOutputter;
> >
> >     public class Test {
> >
> >         public static void main(String[] args) throws Exception {
> >             new Test();
> >         }
> >
> >         public Test() throws Exception {
> >             Document doc = new Document();
> >
> >             Element env = new
> > Element("Envelope","soap","http://schemas.xmlsoap.org/soap/envelope/";);
> >             
> > env.addNamespaceDeclaration(Namespace.getNamespace("xsi","http://www.w3.org/2001/XMLSchema-instance";));
> >             
> > env.addNamespaceDeclaration(Namespace.getNamespace("xsd","http://www.w3.org/2001/XMLSchema";));
> >             doc.setRootElement(env);
> >
> >             Element header = new Element("Header",env.getNamespace());
> >             env.addContent(header);
> >
> >             Element cmsAuthentication = new
> > Element("CMSAuthentication","http://www.centra.com/CWS";);
> >             header.addContent(cmsAuthentication);
> >
> >             Element username = new
> > Element("username",cmsAuthentication.getNamespace());
> >             username.setText("admin");
> >             cmsAuthentication.addContent(username);
> >
> >             Element password = new
> > Element("password",cmsAuthentication.getNamespace());
> >             password.setText("admin");
> >             cmsAuthentication.addContent(password);
> >
> >             Element domain = new
> > Element("Domain",cmsAuthentication.getNamespace());
> >             cmsAuthentication.addContent(domain);
> >
> >             Element body = new Element("Body",env.getNamespace());
> >             env.addContent(body);
> >
> >             Element findUser = new
> > Element("FindUser","http://www.centra.com/CWS";);
> >             body.addContent(findUser);
> >
> >             Element user = new Element("user",findUser.getNamespace());
> >             user.setAttribute("version","3.0");
> >             user.setAttribute("loginName","pbarry");
> >             findUser.addContent(user);
> >
> >             XMLOutputter xmlOut = new XMLOutputter();
> >             xmlOut.setFormat(Format.getPrettyFormat());
> >             SOAPEnvelope soapEnv = new SOAPEnvelope(new
> > ByteArrayInputStream(xmlOut.outputString(doc).getBytes()));
> >             System.out.println(soapEnv);
> >
> >         }
> >     }
> >
> > Is there an easier way to do this?
> >
> > On 6/25/05, Paul Barry <[EMAIL PROTECTED]> wrote:
> > > I am trying to use the axis classes to construct a SOAP message to
> > > build a web services client for a 3rd party app.  I need to construct
> > > a message like this:
> > >
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> > > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";>
> > >     <soap:Header>
> > >         <CMSAuthentication xmlns="http://www.centra.com/CWS";>
> > >             <username>admin</username>
> > >             <password>admin</password>
> > >             <Domain/>
> > >         </CMSAuthentication>
> > >     </soap:Header>
> > >     <soap:Body>
> > >         <FindUser xmlns="http://www.centra.com/CWS";>
> > >             <user version="3.0" loginName="test"/>
> > >         </FindUser>
> > >     </soap:Body>
> > > </soap:Envelope>
> > >
> > > Here is my code:
> > >
> > >         SOAPEnvelope env = new SOAPEnvelope();
> > >
> > >         SOAPHeaderElement header =
> > >             new SOAPHeaderElement(new
> > > QName("http://www.centra.com/CWS";, "CMSAuthentication",""));
> > >
> > >         DocumentBuilder builder = factory.newDocumentBuilder();
> > >         Document doc = builder.newDocument();
> > >         Element username = doc.createElement("username");
> > >         username.appendChild(doc.createTextNode("admin"));
> > >
> > >         header.addChildElement(new SOAPHeaderElement(username));
> > >
> > >         doc = builder.newDocument();
> > >         Element password = doc.createElement("password");
> > >         password.appendChild(doc.createTextNode("admin"));
> > >         header.addChildElement(new SOAPHeaderElement(password));
> > >
> > >         doc = builder.newDocument();
> > >         Element domain = doc.createElement("Domain");
> > >         header.addChildElement(new SOAPHeaderElement(domain));
> > >
> > >         env.addHeader(header);
> > >
> > >         SOAPBodyElement body = new SOAPBodyElement(
> > >             new QName("http://www.centra.com/CWS","FindUser","";));
> > >
> > >         doc = builder.newDocument();
> > >         Element user = doc.createElement("user");
> > >         user.setAttribute("version","3.0");
> > >         user.setAttribute("loginName","test");
> > >         body.addChildElement(new SOAPBodyElement(user));
> > >
> > >         env.addBodyElement(body);
> > >
> > > This unfortunately produces:
> > >
> > > <soapenv:Envelope
> > > xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
> > >  <soapenv:Header>
> > >   <ns1:CMSAuthentication
> > > soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next";
> > > soapenv:mustUnderstand="0" xmlns:ns1="http://www.centra.com/CWS";>
> > >    <username soapenv:actor="" soapenv:mustUnderstand="0">admin</username>
> > >    <password soapenv:actor="" soapenv:mustUnderstand="0">admin</password>
> > >    <Domain soapenv:actor="" soapenv:mustUnderstand="0"/>
> > >   </ns1:CMSAuthentication>
> > >  </soapenv:Header>
> > >  <soapenv:Body>
> > >   <ns2:FindUser xmlns:ns2="http://www.centra.com/CWS";>
> > >    <user loginName="test" version="3.0"/>
> > >   </ns2:FindUser>
> > >  </soapenv:Body>
> > > </soapenv:Envelope>
> > >
> > > This doesn't work with the 3rd party app.  The two reasons are:
> > >
> > > 1.  The prefix is "soapenv", but the 3rd party app expects it to be 
> > > "soap".
> > >
> > > 2.  For each element in the header and body there is a prefix, they
> > > are "ns1" and "ns2".  The 3rd party app expects there to be no prefix.
> > >
> > > I'm sure the Axis-produces SOAP message is compliant and validate,
> > > unfortunately the 3rd party app doesn't like it and I need to find a
> > > way to work around it.  For #2, I would think passing in a QName with
> > > the prefix defined as "" should result in no prefix for those
> > > elements.  Is there a way I can make this happen?  Also, is there any
> > > way, other than hacking SOAPConstants, to get it to user "soap"
> > > instead of "soapenv"?  If I can get Axis to output a SOAP message like
> > > this following one, then it works fine with the 3rd party app:
> > >
> > > <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/";
> > > xmlns:xsd="http://www.w3.org/2001/XMLSchema";
> > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
> > >  <soap:Header>
> > >   <CMSAuthentication
> > > soap:actor="http://schemas.xmlsoap.org/soap/actor/next";
> > > soap:mustUnderstand="0" xmlns="http://www.centra.com/CWS";>
> > >    <username soap:actor="" soap:mustUnderstand="0">admin</username>
> > >    <password soap:actor="" soap:mustUnderstand="0">admin</password>
> > >    <Domain soap:actor="" soap:mustUnderstand="0"/>
> > >   </CMSAuthentication>
> > >  </soap:Header>
> > >  <soap:Body>
> > >   <FindUser xmlns="http://www.centra.com/CWS";>
> > >    <user loginName="test" version="3.0"/>
> > >   </FindUser>
> > >  </soap:Body>
> > > </soap:Envelope>
> > >
> > > Thanks in advance,
> > >
> > > Paul
> > >
> >
>

Reply via email to