-
1. Re: how to set headers in JAX-WS
camateusno Nov 30, 2007 12:32 PM (in response to tpawankumar)Hi friend,
i have the same problem and i think that the jbossws do it a bad parse to some documents WSDL.
If you know something thereon, i thank you very much, for several days working on it... -
2. Re: how to set headers in JAX-WS
asoldano Dec 2, 2007 4:23 AM (in response to tpawankumar)Just tried to be sure, this is working for me. Could you please post both your wsdl contract and the server implementation (if it is done with JBossWS)? Which version of JBossWS are you using?
-
3. Re: how to set headers in JAX-WS
tpawankumar Dec 3, 2007 1:59 AM (in response to tpawankumar)Hi Alessio,
This is the wsdl<?xml version="1.0" encoding="utf-8" ?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://McAfeeAsap.com" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://McAfeeAsap.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://McAfeeAsap.com"> <s:element name="ProcessOrder"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="sOrderXML" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="ProcessOrderResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="ProcessOrderResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="AuthHeader" type="tns:AuthHeader" /> <s:complexType name="AuthHeader"> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="sToken" type="s:string" /> </s:sequence> <s:anyAttribute /> </s:complexType> </s:schema> </wsdl:types> <wsdl:message name="ProcessOrderSoapIn"> <wsdl:part name="parameters" element="tns:ProcessOrder" /> </wsdl:message> <wsdl:message name="ProcessOrderSoapOut"> <wsdl:part name="parameters" element="tns:ProcessOrderResponse" /> </wsdl:message> <wsdl:message name="ProcessOrderAuthHeader"> <wsdl:part name="AuthHeader" element="tns:AuthHeader" /> </wsdl:message> <wsdl:portType name="McAfee_x0020_Order_x0020_ProcessingSoap"> <wsdl:operation name="ProcessOrder"> <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">McAfee Order Processing</wsdl:documentation> <wsdl:input message="tns:ProcessOrderSoapIn" /> <wsdl:output message="tns:ProcessOrderSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="McAfee_x0020_Order_x0020_ProcessingSoap" type="tns:McAfee_x0020_Order_x0020_ProcessingSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="ProcessOrder"> <soap:operation soapAction="http://McAfeeAsap.com/ProcessOrder" style="document" /> <wsdl:input> <soap:body use="literal" /> <soap:header message="tns:ProcessOrderAuthHeader" part="AuthHeader" use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="McAfee_x0020_Order_x0020_ProcessingSoap12" type="tns:McAfee_x0020_Order_x0020_ProcessingSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="ProcessOrder"> <soap12:operation soapAction="http://McAfeeAsap.com/ProcessOrder" style="document" /> <wsdl:input> <soap12:body use="literal" /> <soap12:header message="tns:ProcessOrderAuthHeader" part="AuthHeader" use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="McAfee_x0020_Order_x0020_Processing"> <wsdl:port name="McAfee_x0020_Order_x0020_ProcessingSoap" binding="tns:McAfee_x0020_Order_x0020_ProcessingSoap"> <soap:address location="http://testdrive.mcafeeasap.com/ws/mop/mop.asmx" /> </wsdl:port> <wsdl:port name="McAfee_x0020_Order_x0020_ProcessingSoap12" binding="tns:McAfee_x0020_Order_x0020_ProcessingSoap12"> <soap12:address location="http://testdrive.mcafeeasap.com/ws/mop/mop.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
and on the server side i don't have the implementation,it is third party service we are using.
But i knew there is a method processOrder which takes two parameters one is xmlstring and the other is authheader object.
The Jboss server i am using is Jboss 4.2.1 GA and jbossws is 1.2.1GA.
Please let me know if you have any suggestions?
Thanks,
Pavan -
4. Re: how to set headers in JAX-WS
asoldano Dec 3, 2007 2:53 AM (in response to tpawankumar)I think your issue is due to the way the wsdl:message is defined; I would have expected you to have a binding/operation/input block specifying the two part names, instead you have two different messages for the soap header and the soap body. Take a look at the PingService.wsdl of the webparam samples in the binary distribution for an example.
-
5. Re: how to set headers in JAX-WS
tpawankumar Dec 4, 2007 7:37 AM (in response to tpawankumar)Hi Alessio,
Thanks for the reply.
But this wsdl is third party vendor where i cannot change.
Actually i am migrating the webservice which talks to third party vendor webservice from Weblogic to jboss.
In weblogic it is creating the method with two parameters but in jboss it is not.
Is there any way we can send header parameter with out editing WSDL?
Thanks
Pavan -
6. Re: how to set headers in JAX-WS
asoldano Jan 4, 2008 4:43 AM (in response to tpawankumar)I investigated this a bit further... first of all, the reason why you don't get the parameter corresponding to the soap header is that the JAX-WS specs say that only the wsdl:part from the abstract portion of the contract (i.e. the wsdl:portType section) are mapped to Java method parameters.
I see three possible solutions to this, unfortunately they're all not so easy / for beginners:
- manually modify the wsdl before consuming it, in order to let wsconsume generate the soap header parameter too
- create a SOAPHandler and mess with SAAJ to manually add the header when sending the message
- leverage SunRI tool (wsimport), which starting from v. 2.1.3 has a new option -XadditionalHeaders that map additional headers in wsdl:binding section as method parameters. -
7. Re: how to set headers in JAX-WS
oberiko Mar 19, 2010 5:27 PM (in response to asoldano)Sorry to drag up an old message like this, but I don't see a newer one on the same topic.
Are the three solutions presented still the only way of handling authenication via headers within the operation. For example, a WSDL I'm trying to build a client for has the following:
{code:xml}
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://ws.myWebService.net" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://ws.myWebService.net" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://ws.myWebService.net">
<s:element name="myOperation">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="isSecureMode" type="s:boolean" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="myOperationResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="myOperationResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AuthenticationXML" type="tns:AuthenticationXML" />
<s:complexType name="AuthenticationXML">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="User" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
</s:sequence>
<s:anyAttribute />
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:message name="myOperationSoapIn">
<wsdl:part name="parameters" element="tns:myOperation" />
</wsdl:message>
<wsdl:message name="myOperationSoapOut">
<wsdl:part name="parameters" element="tns:myOperationResponse" />
</wsdl:message>
<wsdl:message name="myOperationAuthenticationXML">
<wsdl:part name="AuthenticationXML" element="tns:AuthenticationXML" />
</wsdl:message>
<wsdl:message name="SendDataAuthenticationXML">
<wsdl:part name="AuthenticationXML" element="tns:AuthenticationXML" />
</wsdl:message>
<wsdl:portType name="myPort">
<wsdl:operation name="myOperation">
<wsdl:input message="tns:myOperationSoapIn" />
<wsdl:output message="tns:myOperationSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="myPort12" type="tns:myPort">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="myOperation">
<soap12:operation soapAction="myWebService:myOperation" style="document" />
<wsdl:input>
<soap12:body use="literal" />
<soap12:header message="tns:myOperationAuthenticationXML" part="AuthenticationXML" use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="myWebServiceWS">
<wsdl:port name="myPort11" binding="tns:myPort11">
<soap:address location="https://devws.myWebService.myDomain.net/myWebServicews/myWebServicews.asmx" />
</wsdl:port>
<wsdl:port name="myPort12" binding="tns:myPort12">
<soap12:address location="https://devws.myWebService.myDomain.net/myWebServicews/myWebServicews.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>{code}
With WsConsume, I don't get the option to add Authentication elements to my methods and setting the binding properties does nothing.