Using Delphi 2005, I am importing a WSDL from here: https://certtransaction.elementexpress.com/express.asmx?wsdl
When I import this WSDL, one of the types is 'TransactionSetup' and it is not importing correctly. According to the documentation 'TransactionSetup' should have the following:
<s:complexType name="TransactionSetup">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupID" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupAccountID" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupAcceptorID" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupApplicationID" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupApplicationName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="TransactionSetupApplicationVersion" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="TransactionSetupMethod" type="tns:TransactionSetupMethod"/>
<s:element minOccurs="1" maxOccurs="1" name="Device" type="tns:Device"/>
<s:element minOccurs="1" maxOccurs="1" name="Embedded" type="tns:BooleanType"/>
<s:element minOccurs="1" maxOccurs="1" name="CVVRequired" type="tns:BooleanType"/>
<s:element minOccurs="1" maxOccurs="1" name="AutoReturn" type="tns:BooleanType"/>
<s:element minOccurs="0" maxOccurs="1" name="CompanyName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="LogoURL" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Tagline" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="WelcomeMessage" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ReturnURL" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ReturnURLTitle" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="OrderDetails" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ProcessTransactionTitle" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="ValidationCode" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="DeviceInputCode" type="tns:DeviceInputCode"/>
</s:sequence>
</s:complexType>
what I get is:
// ************************************************************************ //
// Namespace : https://transaction.elementexpress.com
// ************************************************************************ //
TransactionSetup = class(TRemotable)
private
Fcredentials: Credentials;
Fapplication: Application;
Fterminal: Terminal;
Ftransaction: Transaction;
FtransactionSetup: TransactionSetup;
Faddress: Address;
FpaymentAccount: PaymentAccount;
FextendedParameters: ArrayOfExtendedParameters;
public
destructor Destroy; override;
published
property credentials: Credentials read Fcredentials write Fcredentials;
property application: Application read Fapplication write Fapplication;
property terminal: Terminal read Fterminal write Fterminal;
property transaction: Transaction read Ftransaction write Ftransaction;
property transactionSetup: TransactionSetup read FtransactionSetup write FtransactionSetup;
property address: Address read Faddress write Faddress;
property paymentAccount: PaymentAccount read FpaymentAccount write FpaymentAccount;
property extendedParameters: ArrayOfExtendedParameters read FextendedParameters write FextendedParameters;
end;
One thing I have found, there is a method AND a type both named 'TransactionSetup' and it appears that the importer is somehow capturing the parameters of the method as the type parameters. Here is the imported method:
ExpressSoap = interface(IInvokable)
['{83D77575-DBDE-3A05-D048-60B2F6BCDFE6}']
procedure TransactionSetup(const credentials: Credentials; const application: Application; const terminal: Terminal; const transaction: Transaction; const transactionSetup: TransactionSetup; const address: Address; const paymentAccount: PaymentAccount; const extendedParameters: ArrayOfExtendedParameters; out response: Response); stdcall;
Is there someway to make the importer get the correct type parameters for 'TransactionSetup' type?
I use Delphi 7. I had a similar problem. I downloaded a update importer WSDL and WebService/SOAP runtime. This update is compatible with D2007, D7, D2005 and D2006:
http://cc.embarcadero.com/Item/24535
If you need more details see my blog. In Spanish, sorry:
http://www.3engine.net/wp/2010/02/invocando-un-servicio-web-wcf-desde-delphi-7
Related
I am using Oracle Service Bus 12C with REST services. I add proxy and business services and select to use WSDL with both.
A typical request WSDL would be:
<?xml version = '1.0' encoding = 'UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://TargetNamespace.com/LocationServices_getDistricts_request"
targetNamespace="http://TargetNamespace.com/LocationServices_getDistricts_request"
elementFormDefault="qualified" attributeFormDefault="unqualified" nxsd:encoding="US-ASCII">
<xsd:element name="Districts-Proxy-Request-Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="db" type="xsd:string" minOccurs="0"/>
<xsd:element name="divisionId" type="xsd:integer" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:annotation>
<xsd:appinfo>NXSDSAMPLE=</xsd:appinfo>
<xsd:appinfo>USEHEADER=false</xsd:appinfo>
</xsd:annotation>
</xsd:schema>
And a response would be:
<?xml version = '1.0' encoding = 'UTF-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://TargetNamespace.com/LocationServices_getDistricts_response"
targetNamespace="http://TargetNamespace.com/LocationServices_getDistricts_response"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
elementFormDefault="qualified"
nxsd:version="JSON" nxsd:encoding="US-ASCII">
<xsd:element name="Districts-Proxy-Response-Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="statusCode" type="xsd:integer"/>
<xsd:element name="statusDescription" type="xsd:string"/>
<xsd:element name="data" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="districtId" type="xsd:integer" minOccurs="0"/>
<xsd:element name="districtName" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:annotation xmlns="">
<xsd:appinfo>NXSDSAMPLE=</xsd:appinfo>
<xsd:appinfo>USEHEADER=false</xsd:appinfo>
</xsd:annotation>
</xsd:schema>
I know how to handle requests and responses with strings and numbers. My question is, what would the WSDL be if the request had a file attachment? What if the response did?
Related to above, I use XQuery transformations to convert proxy requests to business requests and business responses to proxy responses. A typical response transformation file would be:
xquery version "1.0" encoding "utf-8";
(:: OracleAnnotationVersion "1.0" ::)
declare namespace ns1="http://TargetNamespace.com/LocationServices_getDistricts_response";
(:: import schema at "Districts-Response.xsd" ::)
declare variable $statusCode as xs:integer external;
declare variable $statusDescription as xs:string external;
declare variable $data external;
declare function local:func($statusCode as xs:integer, $statusDescription as xs:string, $data) as element()
(:: schema-element(ns1:Districts-Proxy-Response-Root-Element) ::) {
<ns1:Districts-Proxy-Response-Root-Element
xmlns:ns1="http://TargetNamespace.com/LocationServices_getDistricts_response">
<ns1:statusCode>{fn:data($statusCode)}</ns1:statusCode>
<ns1:statusDescription>{fn:data($statusDescription)}</ns1:statusDescription>
{
if ( $data eq "" ) then (
<ns1:data/>
) else (
for $x in $data/ns1:data
return <ns1:data>
<ns1:districtId>{fn:data($x/ns1:DISTRICTID)}</ns1:districtId>
<ns1:districtName>{fn:data($x/ns1:DISTRICTNAME)}</ns1:districtName>
</ns1:data>
)
}
</ns1:Districts-Proxy-Response-Root-Element>
};
local:func($statusCode, $statusDescription, $data)
What would the XQuery code be to handle attachments?
I am using jaxb 3.0.0 (xjc.sh) to create Java Classes but for some reason, it is NOT honoring embedded bindings. The same thing works fine with jaxb 2.3.1
$ pwd
/c/jaxb-ri-3.0.0/jaxb-ri/bin
$ ./xjc.sh Validation.xsd
It is creating ApiValidator.java where as I expect it to NOT create a new one rather than refer to the one which I put as embedded binding.
a/model/ApiValidator.java
a/model/ObjectFactory.java
a/model/package-info.java
a/model/ValidationAction.java
$ cat Validation.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="a/model"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
xmlns:tns="a/model" elementFormDefault="qualified">
<xs:attribute name="Description" type="xs:string"/>
<xs:attribute name="Required" type="xs:boolean"/>
<xs:complexType name="ValidationAction">
<xs:sequence>
<xs:element name="api" type="xs:string" tns:Description="Indicates the validation API"/>
<xs:element name="method" type="xs:string" tns:Description="Indicates the validation method"/>
<xs:element name="beanName" type="xs:string" tns:Description="Validation bean name"/>
<xs:element name="validationClass" type="xs:string" tns:Description="Validation class type"/>
<xs:element name="idOwner" type="xs:int" tns:Description="Indicates the owner associated with the validation"/>
<xs:element name="valid" type="xs:boolean" tns:Description="Indicates if validation is valid"/>
<xs:element name="validator" type="tns:ApiValidator" minOccurs="0" maxOccurs="1"
tns:Description="Reference to the API validator"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ApiValidator">
<xs:annotation>
<xs:appinfo>
<jaxb:bindings node="//xs:complexType[#name='ApiValidator']">
<jaxb:class ref="a.ApiValidator"/>
</jaxb:bindings>
</xs:appinfo>
</xs:annotation>
</xs:complexType>
</xs:schema>
Whereas if I do the same with 2.3.1 version,
$ ./xjc.sh Validation.xsd
Java major version: 8
parsing a schema...
compiling a schema...
a\model\ObjectFactory.java
a\model\ValidationAction.java
a\model\package-info.java
I need to use the 3.0.0 version as it generates jakarta namespace. Please suggest why is it not working and how to fix it?
This behavior is same with below-mentioned xml:
$ cat V.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="a/model"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
xmlns:tns="a/model" elementFormDefault="qualified">
<xs:attribute name="Description" type="xs:string"/>
<xs:attribute name="Required" type="xs:boolean"/>
<xs:complexType name="ValidationAction">
<xs:sequence>
<xs:element name="api" type="xs:string" tns:Description="Indicates the validation API"/>
<xs:element name="method" type="xs:string" tns:Description="Indicates the validation method"/>
<xs:element name="beanName" type="xs:string" tns:Description="Validation bean name"/>
<xs:element name="validationClass" type="xs:string" tns:Description="Validation class type"/>
<xs:element name="idOwner" type="xs:int" tns:Description="Indicates the owner associated with the validation"/>
<xs:element name="valid" type="xs:boolean" tns:Description="Indicates if validation is valid"/>
<xs:element name="validator" type="tns:ApiValidator" minOccurs="0" maxOccurs="1"
tns:Description="Reference to the API validator"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ApiValidator">
<xs:annotation>
<xs:appinfo>
<jaxb:class ref="rd.ApiValidator"/>
</xs:appinfo>
</xs:annotation>
</xs:complexType>
</xs:schema>
As suggested in :
Jaxb implClass specification ignored for rootElement
turned out, I had to change the line from:
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
to
xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" jaxb:version="3.0"
Whenever I try to execute a service getContractHdr using online test tools like :
http://www.soapclient.com/soaptest.html
I get the error listed below. The type (of inTENANTREFNO ) is an INTEGER. Even when I place something like 33 in for the field inTENANTREFNO, I still get the error of "type mismatch". Additionally, the message states that the variable inTENANTREFNO is associated with the namespace of am but I do not see why gsoap is making this assignment.
Question
How can I fix this so that I no longer get the error? Is there a way to
configure this so that the namespaces are not used at all? Why am I
getting
it in the first place? I have seen this message here but it is not clear
as to whether or not implementing this would resolve the problem in
this case
Note: All works fine whenever I use the sample generated .xml files. I fill out the fields of course.The service runs and I get data (correct) back. I execute it with "ServerName < testfile.xml"
When I attempt to execute the service from one of the online testing areas (as mentioned above). It does not work citing a "type mismatch".
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="urn:conmony">
<SOAP-ENV:Body>
<ns:getContractHdr>
<ns:inLogonID></ns:inLogonID>
<ns:inLogonPassword></ns:inLogonPassword>
<ns:inTENANTREFNO>0</ns:inTENANTREFNO>
<ns:incallhost></ns:incallhost>
<ns:incallpid>0</ns:incallpid>
<ns:incallfilename></ns:incallfilename>
<ns:incalllineno>0</ns:incalllineno>
</ns:getContractHdr>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Error message
SOAP-ENV:ClientValidation constraint violation: invalid value in
element 'am:inTENANTREFNO'
Error Message With SOAP Fault
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:am="urn:conmony" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Validation constraint violation: invalid value in element 'am:inTENANTREFNO'</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Ran soapcpp2 -c -n -pdukmony - AND - soapcpp2 -c on a file with the contents below
//gsoap am service name: conmony
//gsoap am service style: document
//gsoap am service encoding: literal
//gsoap am service location: http://99.33.23.2232:8075
//gsoap am schema namespace: urn:conmony
typedef char *xsd__string;
typedef char *xsd__anyURI;
typedef float xsd__float;
typedef long xsd__int;
typedef double xsd__double;
typedef unsigned long long xsd__positiveInteger;
typedef struct am__struct_DBCONTRACTHDR{
xsd__int TENANTREFNO;
xsd__string FirstName;
xsd__string MiddleName;
xsd__string LastName;
xsd__string EMail;
xsd__string CellPhoneNo;
xsd__string HomePhoneNo;
xsd__string AsgnLogonID;
xsd__string WebPicLocation;
xsd__int ReturnCode;
xsd__double KeyID;
xsd__string Message; };
typedef struct am__CONTRACTHDRItems {
struct am__struct_DBCONTRACTHDR *__ptr;
int __size;
int __offset; };
inTENANTREFNO
int am__getContractHdr(
xsd__int inTENANTREFNO,
xsd__string inLogonID,
xsd__string inLogonPassword,
xsd__string incallhost,
xsd__int incallpid,
xsd__string incallfilename,
xsd__int incalllineno,
struct am__CONTRACTHDRItems *DBListing);
The result is the conmony.wsdl file
<definitions xmlns:tns="urn:conmony/conmony.wsdl" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:am="urn:conmony" xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:HTTP="http://schemas.xmlsoap.org/wsdl/http/" xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/" xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="conmony" targetNamespace="urn:conmony/conmony.wsdl">
<types>
<schema xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:am="urn:conmony" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:conmony" elementFormDefault="qualified" attributeFormDefault="unqualified">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="struct-DBCONTRACTHDR">
<!-- am__struct_DBCONTRACTHDR -->
<sequence>
<element name="TENANTREFNO" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<!-- am__struct_DBCONTRACTHDR::TENANTREFNO -->
<element name="FirstName" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::FirstName -->
<element name="MiddleName" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::MiddleName -->
<element name="LastName" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::LastName -->
<element name="EMail" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::EMail -->
<element name="CellPhoneNo" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::CellPhoneNo -->
<element name="HomePhoneNo" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::HomePhoneNo -->
<element name="AsgnLogonID" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::AsgnLogonID -->
<element name="WebPicLocation" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::WebPicLocation -->
<element name="ReturnCode" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<!-- am__struct_DBCONTRACTHDR::ReturnCode -->
<element name="KeyID" type="xsd:double" minOccurs="1" maxOccurs="1"/>
<!-- am__struct_DBCONTRACTHDR::KeyID -->
<element name="Message" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__struct_DBCONTRACTHDR::Message -->
</sequence>
</complexType>
<complexType name="CONTRACTHDRItems">
<!-- am__CONTRACTHDRItems -->
<sequence>
<element name="item" type="am:struct-DBCONTRACTHDR" minOccurs="0" maxOccurs="unbounded" nillable="false"/>
</sequence>
</complexType>
<!-- operation request element -->
<element name="getContractHdr">
<complexType>
<sequence>
<element name="inTENANTREFNO" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<!-- am__getContractHdr::inTENANTREFNO -->
<element name="inLogonID" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__getContractHdr::inLogonID -->
<element name="inLogonPassword" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__getContractHdr::inLogonPassword -->
<element name="incallhost" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__getContractHdr::incallhost -->
<element name="incallpid" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<!-- am__getContractHdr::incallpid -->
<element name="incallfilename" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__getContractHdr::incallfilename -->
<element name="incalllineno" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<!-- am__getContractHdr::incalllineno -->
</sequence>
</complexType>
</element>
<!-- operation response element -->
<element name="getContractHdrResponse">
<complexType>
<sequence>
<element name="DBListing" type="am:CONTRACTHDRItems" minOccurs="0" maxOccurs="1" nillable="true"/>
<!-- am__getContractHdr::DBListing -->
</sequence>
</complexType>
</element>
</schema>
</types>
<message name="getContractHdrRequest">
<part name="Body" element="am:getContractHdr"/>
<!-- am__getContractHdr::am__getContractHdr -->
</message>
<message name="getContractHdrResponse">
<part name="Body" element="am:getContractHdrResponse"/>
</message>
<portType name="conmonyPortType">
<operation name="getContractHdr">
<documentation>Service definition of function am__getContractHdr</documentation>
<input message="tns:getContractHdrRequest"/>
<output message="tns:getContractHdrResponse"/>
</operation>
</portType>
<binding name="conmony" type="tns:conmonyPortType">
<SOAP:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getContractHdr">
<SOAP:operation soapAction=""/>
<input>
<SOAP:body parts="Body" use="literal"/>
</input>
<output>
<SOAP:body parts="Body" use="literal"/>
</output>
</operation>
</binding>
<service name="conmony">
<documentation>gSOAP 2.8.26 generated service definition</documentation>
<port name="conmony" binding="tns:conmony">
<SOAP:address location="http://99.33.23.2232:8075"/>
</port>
</service>
</definitions>
UPDATE:
Changed header portion of file that soapcpp2 is ran upon to:
//gsoap ns service name: conmony Special SOAP SErvices
//gsoap ns service protocol: SOAP
//gsoap ns service style: document
//gsoap ns service encoding: literal
//gsoap ns service namespace: http://99.33.23.2232:8075?conmony.wsdl
//gsoap ns service location: http://99.33.23.2232:8075
//gsoap ns schema namespace: urn:conmony
and still got the same issue
But still getting data when filling out the sample req.xml files generated
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns="urn:conmony"><SOAP-ENV:Body><ns:getContractHdrResponse><ns:DBListing><ns:item><ns:TENANTREFNO>8288</ns:TENANTREFNO><ns:FirstName>Test</ns:FirstName><ns:MiddleName></ns:MiddleName><ns:LastName>Last</ns:LastName><ns:EMail>testing#last.com</ns:EMail><ns:CellPhoneNo>210-444-2212</ns:CellPhoneNo><ns:HomePhoneNo>210-444-2212</ns:HomePhoneNo><ns:AsgnLogonID>w10testing</ns:AsgnLogonID><ns:WebPicLocation>stuff</ns:WebPicLocation><ns:ReturnCode>0</ns:ReturnCode><ns:KeyID>0.000000</ns:KeyID><ns:Message> testing ...</ns:Message></ns:item></ns:DBListing></ns:getContractHdrResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Everything in the ".h file" and ".c" file was changed so that it used "ns" namespace and not the "am" namespace
I would like to create a Mule Project, and the idea is to send a SOAP message (for example through soapUI) to this project, and then, redirect the message to an external web service.
I have read the documentation, I can't figure out how to do this simple task.
I would appreciate if someone could help me. I am using Mule v3.8.
Thanks in advance.
You can use the Web Service Consumer connector as explained at MuleSoft Documentation and Video Tutorial
In general,
You can use:
HTTP endpoint (request-response) ->
CXF component (for you proxy service, optional) ->
Web Service Consumer (to call needed service)
If I'm not very clear, I can help you in building this project.
update
I made a simple service and now we have wsdl:
<wsdl:definitions name="SimpleServiceService" targetNamespace="http://simple/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://simple/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema elementFormDefault="unqualified" targetNamespace="http://simple/" version="1.0" xmlns:tns="http://simple/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="doSomething" type="tns:doSomething"/>
<xs:element name="doSomethingResponse" type="tns:doSomethingResponse"/>
<xs:complexType name="doSomething">
<xs:sequence>
<xs:element minOccurs="0" name="Input" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="doSomethingResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="doSomethingResponse">
<wsdl:part element="tns:doSomethingResponse" name="parameters"/>
</wsdl:message>
<wsdl:message name="doSomething">
<wsdl:part element="tns:doSomething" name="parameters"/>
</wsdl:message>
<wsdl:portType name="SimpleService">
<wsdl:operation name="doSomething">
<wsdl:input message="tns:doSomething" name="doSomething"/>
<wsdl:output message="tns:doSomethingResponse" name="doSomethingResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SimpleServiceServiceSoapBinding" type="tns:SimpleService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="doSomething">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="doSomething">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="doSomethingResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SimpleServiceService">
<wsdl:port binding="tns:SimpleServiceServiceSoapBinding" name="SimpleServicePort">
<soap:address location="http://exoldy-simple-mule-project.cloudhub.io/service"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Next we need to interact with this service using proxy service implemented on Mule
<mule xmlns:cxf="http://www.mulesoft.org/schema/mule/cxf" xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:ws="http://www.mulesoft.org/schema/mule/ws" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ws http://www.mulesoft.org/schema/mule/ws/current/mule-ws.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd
http://www.mulesoft.org/schema/mule/cxf http://www.mulesoft.org/schema/mule/cxf/current/mule-cxf.xsd">
<ws:consumer-config name="Web_Service_Consumer" service="SimpleServiceService" port="SimpleServicePort" serviceAddress="http://exoldy-simple-mule-project.cloudhub.io/service" wsdlLocation="http://exoldy-simple-mule-project.cloudhub.io/service?wsdl" doc:name="Web Service Consumer"/>
<http:listener-config name="HTTP_Listener_Configuration1" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>
<flow name="external" initialState="started">
<http:listener config-ref="HTTP_Listener_Configuration1" path="service" doc:name="Receive HTTP request" doc:description="This endpoint receives an HTTP message."/>
<logger message="#[flow.name]" level="INFO" doc:name="Logger"/>
<cxf:proxy-service payload="body" doc:name="CXF" namespace="http://simple/" service="SimpleServiceService" wsdlLocation="http://exoldy-simple-mule-project.cloudhub.io/service?wsdl"/>
<ws:consumer config-ref="Web_Service_Consumer" operation="doSomething" doc:name="Web Service Consumer"/>
</flow>
</mule>
Now everything should work, at least it works for me )
Trying to build a demo contract-first service from a sample WSDL (using CXF 2.7.1):
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="OrderProcessService" targetNamespace="http://order.demo/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://order.demo/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://order.demo/" xmlns:tns="http://order.demo/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="processOrder" type="tns:processOrder" />
<xs:element name="processOrderResponse" type="tns:processOrderResponse" />
<xs:complexType name="processOrder">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="tns:order" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="order">
<xs:sequence>
<xs:element minOccurs="0" name="customerID" type="xs:string" />
<xs:element minOccurs="0" name="itemID" type="xs:string" />
<xs:element name="price" type="xs:double" />
<xs:element name="qty" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="processOrderResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="processOrderResponse">
<wsdl:part element="tns:processOrderResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="processOrder">
<wsdl:part element="tns:processOrder" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="OrderProcess">
<wsdl:operation name="processOrder">
<wsdl:input message="tns:processOrder" name="processOrder">
</wsdl:input>
<wsdl:output message="tns:processOrderResponse" name="processOrderResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="OrderProcessServiceSoapBinding" type="tns:OrderProcess">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="processOrder">
<soap:operation soapAction="" style="document" />
<wsdl:input name="processOrder">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="processOrderResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="OrderProcessService">
<wsdl:port binding="tns:OrderProcessServiceSoapBinding" name="OrderProcessPort">
<soap:address location="http://localhost:8080/OrderProcess" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
I issued the following:
wsdl2java -ant -impl -server -d src OrderProcess.wsdl
Source code generation goes fine but when I try to build the server, using ant OrderProcessServer, I receive the following exception:
OrderProcessServer:
[java] Starting Server
[java] Exception in thread "main" java.lang.ExceptionInInitializerError
[java] at org.eclipse.jetty.util.component.AbstractLifeCycle.<clinit>(AbstractLifeCycle.java:33)
[java] at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.activate(JettyHTTPDestination.java:178)
[java] at org.apache.cxf.transport.AbstractObservable.setMessageObserver(AbstractObservable.java:48)
[java] at org.apache.cxf.binding.AbstractBaseBindingFactory.addListener(AbstractBaseBindingFactory.java:95)
[java] at org.apache.cxf.binding.soap.SoapBindingFactory.addListener(SoapBindingFactory.java:895)
[java] at org.apache.cxf.endpoint.ServerImpl.start(ServerImpl.java:131)
[java] at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:360)
[java] at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:251)
[java] at org.apache.cxf.jaxws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:152)
[java] at javax.xml.ws.Endpoint.publish(Endpoint.java:57)
[java] at demo.order.OrderProcess_OrderProcessPort_Server.<init>(OrderProcess_OrderProcessPort_Server.java:19)
[java] at demo.order.OrderProcess_OrderProcessPort_Server.main(OrderProcess_OrderProcessPort_Server.java:23)
[java] Caused by: java.lang.IllegalArgumentException: key can't be empty
[java] at java.lang.System.checkKey(System.java:774)
[java] at java.lang.System.getProperty(System.java:647)
[java] at org.eclipse.jetty.util.log.Log$1.run(Log.java:122)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at org.eclipse.jetty.util.log.Log.<clinit>(Log.java:85)
[java] ... 12 more
[java] Java Result: 1
BUILD SUCCESSFUL
Total time: 2 seconds
My questions are:
What key?
How do provide it so that I don't get the exception?
Why is wsdl2java producing code that is incomplete? (i.e. isn't the .wsdl file sufficient?)
UPDATE: The ANT build.xml file produced by the wsdl2java command has these 2 seemingly relevant lines:
<sysproperty key="java.util.logging.config.file" value="${cxf.etc.dir}/logging.properties"/>
<sysproperty key="log4j.configuration" value="file:///${cxf.etc.dir}/log4j.properties"/>
Are they key (no pun intended) to the problem?
If so, what values should I put there in order to fix it?
How do I tell wsdl2java to generate code that I don't need to fix?
Jetty's Log implementation is reading the system properties like this:
Enumeration<String> systemKeyEnum = Enumeration<String>)System.getProperties().propertyNames();
while (systemKeyEnum.hasMoreElements())
{
String key = systemKeyEnum.nextElement();
String val = System.getProperty(key);
// ... (process key/values)
}
For some reason you have managed to have an empty key: "" in your System properties. So check all the places where you set System Properties programmatically (System.setProperty) and your java commandline for -D options.
If that doesn't help, try to print your system properties before this exception occurs or do a jpda debug session and place a breakpoint either at Log line <122 or at System.checkKey().
The empty keys come from the cxfrun macro in the generated ant script, build.xml.
Comment it out like so and you should be fine:
<arg value="#{param1}"/>
<arg value="#{param2}"/>
<arg value="#{param3}"/>
<arg value="#{param4}"/>
<arg value="#{param5}"/>
<jvmarg value="${cxf.endorsed.flag}"/>
<!-- Commented out to remove empty keys in system properties -->
<!-- jvmarg value="#{jvmarg1}"/>
<jvmarg value="#{jvmarg2}"/>
<jvmarg value="#{jvmarg3}"/>
<jvmarg value="#{jvmarg4}"/>
<jvmarg value="#{jvmarg5}"/ -->
The empty key can also come from "comments", of this type:
=====================================
This line above may have been marked as a comment, but the system is going to think of the equals sign as a key value marker.