You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Christian Gosch <ch...@inovex.de> on 2009/09/22 15:30:19 UTC

How can I force namespace declarations in the envelope? (Axis2 1.4.1 / XMLbeans 2.3 / Java 1.4.2)

Hi,

by default, Axis2 seems to put namespace declarations like 
'xmlns:ns="http://my.namespace.com/this/one/is/it"' at the latest / 
deepest point in the XML possible, which seems to be perfectly in line 
with W3C requirements.

My SOAP client has to talk to the Web Service via a XML security gateway 
(probably Cisco ACE XML gateway) which is configured to require all 
namespaces of the request to be declared in the SOAP envelope.

How can I achieve that using Axis2 1.4.1?

Environment: 
- IBM WebSphere Application Server 6.0.2 / IBM Java 1.4.2 JRE (stuck to)
- Axis2 1.4.1 / XMLbeans 2.3.0 (only for client operation)


Examples:


That is what Axis2 currently produces, using simply the generated Java 
stub class:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
	<Request xmlns="http://premconn.premiereconnect.com/2007/02" 
soapenv:mustUnderstand="0">
		<ReceiverKey>http://my.receiver.key/</ReceiverKey>
		<RequestID>f0aFQR5s_AIBYHgdN16pqlf</RequestID>
		<Authentication>
			<XDDSAuth>
				<RequesterID>###</RequesterID>
				<Password>***</Password>
			</XDDSAuth>
		</Authentication>
	</Request>
</soapenv:Header>
<soapenv:Body>
	<ns:ListCreateRequest 
xmlns:ns="http://premconn.premiereconnect.com/2007/02">
		<ns:SubmitId>f0aFQR5s_AIBYHgdN16pqlf</ns:SubmitId>
etc. etc. etc.


And *that* is what ACE XML gateway seems to expect:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns="http://premconn.premiereconnect.com/2007/02">
<soapenv:Header>
	<ns:Request soapenv:mustUnderstand="0">
		<ns:ReceiverKey>http://my.receiver.key/</ns:ReceiverKey>
		<ns:RequestID>f0aFQR5s_AIBYHgdN16pqlf</ns:RequestID>
		<ns:Authentication>
			<ns:XDDSAuth>
				<ns:RequesterID>###</ns:RequesterID>
				<ns:Password>***</ns:Password>
			</ns:XDDSAuth>
		</ns:Authentication>
	</ns:Request>
</soapenv:Header>
<soapenv:Body>
	<ns:ListCreateRequest>
		<ns:SubmitId>f0aFQR5s_AIBYHgdN16pqlf</ns:SubmitId>
etc. etc. etc.


How can I force Axis2 to produce output that conforms to these 
requirements?


Maybe this is related to Jira #AXIS2-4215 , URL: 
https://issues.apache.org/jira/browse/AXIS2-4215


Thanks in advance for useful hints and help,
-- 
Dipl.-Inform. Christian Gosch, PMI PMP
Systems Architecture, Project Management

inovex GmbH
Büro Pforzheim
Karlsruher Strasse 71
D-75179 Pforzheim
Tel: +49 (0)7231 3191-85
Fax: +49 (0)7231 3191-91
c.gosch@inovex.de
www.inovex.de

Sitz der Gesellschaft: Pforzheim
AG Mannheim, HRB 502126
Geschäftsführer: Stephan Müller 




RE: How can I force namespace declarations in the envelope? (Axis2 1.4.1 / XMLbeans 2.3 / Java 1.4.2)

Posted by Christian Gosch <ch...@inovex.de>.
Finally I found a solution by deep and rigorous web search...

http://stackoverflow.com/questions/74960/how-do-i-add-a-namespace-reference-to-a-soap-response-with-apache-axis2-and-wsdl2

explains how to do it.


BUT:

The result is not that nice.


To be honest: I forgot to mention that I generated the client code with 
WSDL2Java and wanted to use the generated stu(b|ff) just as it fell on 
my HD.


The solution presented on the page urled above basically supports this 
approach by adding minimal extensions to the generated code. BUT:

(1) You have to add the extension to every method request implementation 
in the generated code. At least every method implementation your client 
code will use :-)

(2) The approach is to add a namespace declaration as early as possible 
to the envelope generated. Thats quite fine, but its not early enough: 
The SOAP message body is already constructed and already contains its 
own namespace declaration(s) as required, when the envelope is 
generated. Thus the namespace in question (or: all namespaces in 
question) tend(s) to be declared twice: In the envelope and at (their) 
first occurrence in the body.

(3) The SOAP header is generated *after* adding the namespace 
declaration in this approach, but its visibility scope downwards into 
the element hierarchy is only "1 step", that is: Elements directly 
beneath the Header element make use of the namespace declared, but 
elements deeper inside will receive their own default namespace 
declaration -- using the same URL of course.

Finally I do not yet have a confirmation that this format of SOAP call 
really will pass the XML security gateway. But calling the Web Service 
directly works fine :-)

I will update this thread if there are relevant news :-)


Christian


> -----Original Message-----
> From: Christian Gosch
> Sent: Tuesday, September 22, 2009 3:30 PM
> To: axis-user
> Subject: How can I force namespace declarations in the envelope? 
(Axis2
> 1.4.1 / XMLbeans 2.3 / Java 1.4.2)
> 
> Hi,
> 
> by default, Axis2 seems to put namespace declarations like
> 'xmlns:ns="http://my.namespace.com/this/one/is/it"' at the latest /
> deepest point in the XML possible, which seems to be perfectly in line
> with W3C requirements.
> 
> My SOAP client has to talk to the Web Service via a XML security 
gateway
> (probably Cisco ACE XML gateway) which is configured to require all
> namespaces of the request to be declared in the SOAP envelope.
> 
> How can I achieve that using Axis2 1.4.1?
> 
> Environment:
> - IBM WebSphere Application Server 6.0.2 / IBM Java 1.4.2 JRE (stuck 
to)
> - Axis2 1.4.1 / XMLbeans 2.3.0 (only for client operation)
> 
> 
> Examples:
> 
> 
> That is what Axis2 currently produces, using simply the generated Java
> stub class:
> 
> <?xml version='1.0' encoding='UTF-8'?>
> <soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
> <soapenv:Header>
> 	<Request xmlns="http://premconn.premiereconnect.com/2007/02"
> soapenv:mustUnderstand="0">
> 		<ReceiverKey>http://my.receiver.key/</ReceiverKey>
> 		<RequestID>f0aFQR5s_AIBYHgdN16pqlf</RequestID>
> 		<Authentication>
> 			<XDDSAuth>
> 				<RequesterID>###</RequesterID>
> 				<Password>***</Password>
> 			</XDDSAuth>
> 		</Authentication>
> 	</Request>
> </soapenv:Header>
> <soapenv:Body>
> 	<ns:ListCreateRequest
> xmlns:ns="http://premconn.premiereconnect.com/2007/02">
> 		<ns:SubmitId>f0aFQR5s_AIBYHgdN16pqlf</ns:SubmitId>
> etc. etc. etc.
> 
> 
> And *that* is what ACE XML gateway seems to expect:
> 
> <?xml version='1.0' encoding='UTF-8'?>
> <soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
> xmlns:ns="http://premconn.premiereconnect.com/2007/02">
> <soapenv:Header>
> 	<ns:Request soapenv:mustUnderstand="0">
> 		<ns:ReceiverKey>http://my.receiver.key/</ns:ReceiverKey>
> 		<ns:RequestID>f0aFQR5s_AIBYHgdN16pqlf</ns:RequestID>
> 		<ns:Authentication>
> 			<ns:XDDSAuth>
> 				<ns:RequesterID>###</ns:RequesterID>
> 				<ns:Password>***</ns:Password>
> 			</ns:XDDSAuth>
> 		</ns:Authentication>
> 	</ns:Request>
> </soapenv:Header>
> <soapenv:Body>
> 	<ns:ListCreateRequest>
> 		<ns:SubmitId>f0aFQR5s_AIBYHgdN16pqlf</ns:SubmitId>
> etc. etc. etc.
> 
> 
> How can I force Axis2 to produce output that conforms to these
> requirements?
> 
> 
> Maybe this is related to Jira #AXIS2-4215 , URL:
> https://issues.apache.org/jira/browse/AXIS2-4215
> 
> 
> Thanks in advance for useful hints and help,
> --
> Dipl.-Inform. Christian Gosch, PMI PMP
> Systems Architecture, Project Management
> 
> inovex GmbH
> Büro Pforzheim
> Karlsruher Strasse 71
> D-75179 Pforzheim
> Tel: +49 (0)7231 3191-85
> Fax: +49 (0)7231 3191-91
> c.gosch@inovex.de
> www.inovex.de
> 
> Sitz der Gesellschaft: Pforzheim
> AG Mannheim, HRB 502126
> Geschäftsführer: Stephan Müller
> 
> 
> 
> 
> !DSPAM:4ab8d33e326661724765873!
> 
>