You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by bu...@apache.org on 2003/06/10 17:20:39 UTC
DO NOT REPLY [Bug 20650] New: -
Duplicate Namespace Declaration: Bug in Serialization.
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20650>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=20650
Duplicate Namespace Declaration: Bug in Serialization.
Summary: Duplicate Namespace Declaration: Bug in Serialization.
Product: Axis
Version: 1.1rc2
Platform: All
OS/Version: Other
Status: NEW
Severity: Major
Priority: Other
Component: Serialization/Deserialization
AssignedTo: axis-dev@ws.apache.org
ReportedBy: john_smith_2002@msn.com
I am using javax.xml.soap implementation to create the soap elements.
When i add a custom Namespace and keep adding the elements in that
namespace,
then the custom namespace declaration is repeated.
public void testquick() throws Exception {
MessageFactory msgfactory = MessageFactory.newInstance();
SOAPFactory factory = SOAPFactory.newInstance();
SOAPMessage outputmsg = msgfactory.createMessage();
SOAPBody bodyout = outputmsg.getSOAPPart().getEnvelope().getBody();
Name n = factory.createName("HelloWorld","env",
"http://helloworld.com");
SOAPBodyElement entry = bodyout.addBodyElement(n);
n = factory.createName("code","env", "http://helloworld.com");
SOAPElement element = factory.createElement(n);
entry.addChildElement(element);
if (outputmsg != null) {
if (outputmsg.saveRequired()) {
outputmsg.saveChanges();
}
outputmsg.writeTo(System.out);
}
}
Output is:
<?xml version="1.0" encoding="UTF-8"?>
<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:Body>
<env:HelloWorld xmlns:env="http://helloworld.com">
<env:code xmlns:env="http://helloworld.com"/> <-- see the Namespace
declaration is repeated
</env:HelloWorld>
</soapenv:Body>
Ideal Output is
<?xml version="1.0" encoding="UTF-8"?>
<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:Body>
<env:HelloWorld xmlns:env="http://helloworld.com">
<env:code />
</env:HelloWorld>
</soapenv:Body>
I personally feel this is because of the following code in MessageElement
public MessageElement(String localPart, String prefix, String namespace)
{
this.namespaceURI = namespace;
this.name = localPart;
this.prefix = prefix;
addMapping(new Mapping(namespace, prefix)); <-- Adding prefix for
each declaration without checking whether parent element is in same
namespace.
}
Or
<MessageElement>
protected void outputImpl(SerializationContext context) throws Exception
{
if (elementRep != null) {
boolean oldPretty = context.getPretty();
context.setPretty(false);
context.writeDOMElement(elementRep);
context.setPretty(oldPretty);
return;
}
if (textRep != null) {
boolean oldPretty = context.getPretty();
context.setPretty(false);
context.writeSafeString(textRep.getData());
context.setPretty(oldPretty);
return;
}
if (prefix != null)
context.registerPrefixForURI(prefix, namespaceURI);
if (namespaces != null) {
for (Iterator i = namespaces.iterator(); i.hasNext();) {
Mapping mapping = (Mapping) i.next();
context.registerPrefixForURI(mapping.getPrefix(),
mapping.getNamespaceURI());
}
}
</MessageElement>
context.registerPrefixForURI should check for if prefix or URI is already
present.
Note : Please suggest a solution (If any) using only javax.xml.soap
interfaces. I want to keep the generic interfaces and not make direct calls
to MessageElements.