Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsGeneralPHPASPPerlColdFusionFlashHTML, CSS, ScriptsBrowsers

Webmaster Forum / ColdFusion / Advanced Techniques / April 2007



Tip: Looking for answers? Try searching our database.

Enumeration problem consuming clickandbuy web service

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
goransv - 22 Apr 2007 21:24 GMT
I have built a cf app that will consume Click & Buy?s SOAP interface RMI
(Registration Manager Interface) to register new Users. Click & buy states that
the SOAP interface is 1.2 compliant, but my test with different generic soap
client indicates that it is not true.

Any way I have managed to do all the structs and arrays, but get stuck on a
enumerated value. I got this error:

Could not perform web service invocation "registerUser".
Here is the fault returned when invoking the web service operation:

 java.lang.IllegalArgumentException: argument type mismatch

I have read all the documentation for the RMI, so I know the right values. But
I do not know how to set a value to type enumerated. I have installed all the
lates hotfixes (CFMX 7.02, win 20003), tested to consume other web services
like babelfish and a weather service with no problem. I have also googled and
read all threads on the subject, and that there was a fix for this problem in
the work back in 2005. I think that by now there should be a fix for the enum
problem so that you don?t have to use bad temporay solutions, but I have found
nothing!

I have also run the web service with wsdl2java and examined the classes with
Eclipse. I?m no Java programer but I think I have manged to pin point the
origin of the error message in the RegistrationManagerRegistrationGender class.
 
It feels as I am stuck on the finish line.

References:

http://mail-archives.apache.org/mod_mbox/ws-axis-dev/200604.mbox/%3C4736124.1145
204669658.JavaMail.jira@brutus%3E

http://www.houseoffusion.com/groups/cf-talk/thread.cfm/threadid:30232


http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=1&catid=7&t
hreadid=1251325&highlight_key=y&keyw

ord1=enum

http://www.sys-con.tv/read/86131.htm

http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb400996

http://www.xmethods.net/ve2/Tools.po

http://www.mindreef.net/tide/scopeit/start.do

http://wsdl.eu.clickandbuy.com/RMI/2.0/RegistrationManagerbinding.wsdl

http://soapclient.com/interop/interopTest.html

http://soapclient.com/soapclient.com/soaptest.html

The code to consume the web service:
<cfscript>
 
 registerUser = structNew();
 registerUser.sellerID = 123456;
 registerUser.rmPassword = "*****";
 registerUser.regRequest = ArrayNew(1);
 registerUser.regRequest[1] = StructNew();
 registerUser.regRequest[1].rUser = ArrayNew(1);
 registerUser.regRequest[1].rUser[1] = StructNew();
 registerUser.regRequest[1].rUser[1].firstName = "Nisse";

 registerUser.regRequest[1].rUser[1].lastName = "Crapp";

 registerUser.regRequest[1].rUser[1].middleName = "Anka";

 registerUser.regRequest[1].rUser[1].dateOfBirth = "19780101";
 
 registerUser.regRequest[1].rUser[1].language = "se";
 
 registerUser.regRequest[1].rUser[1].sex = arrayNew(1);
 registerUser.regRequest[1].rUser[1].sex[1] = StructNew();
 registerUser.regRequest[1].rUser[1].sex[1].Gender = "M";
 
 registerUser.regRequest[1].rUser[1].addr = ArrayNew(1);
 registerUser.regRequest[1].rUser[1].addr[1] = StructNew();
 registerUser.regRequest[1].rUser[1].addr[1].email = "nisse@*****.se";
   
 registerUser.regRequest[1].rUser[1].addr[1].street = "Stagneliusv";
 
 registerUser.regRequest[1].rUser[1].addr[1].street2 = "rffdfdgfdg";
 
 registerUser.regRequest[1].rUser[1].addr[1].city = "Stockholm";
 
 registerUser.regRequest[1].rUser[1].addr[1].ZIP = "11257";
 
 registerUser.regRequest[1].rUser[1].addr[1].state = "fdgf";
 
 registerUser.regRequest[1].rUser[1].addr[1].country = "Sweden";
 
 registerUser.regRequest[1].rUser[1].addr[1].telephoneNr = "0708306261";
 
 registerUser.regRequest[1].rUser[1].addr[1].mobileTelNr = "0708306261";
 
 registerUser.regRequest[1].rUser[1].addr[1].fax = "4565656546";
 
 registerUser.regRequest[1].rUser[1].addr[1].company = "fdddsffdds";
 
 registerUser.regRequest[1].rUser[1].pData = arrayNew(1);
 registerUser.regRequest[1].rUser[1].pData[1] = structNew();
 //registerUser.regRequest[1].rUser[1].pData[1].paymentDD = arrayNew(1);
// registerUser.regRequest[1].rUser[1].pData[1].paymentDD[1] = structNew();
 //regRequest.rUser[1].pData[1].paymentDD = arrayNew(1);
 //regRequest.rUser[1].pData[1].paymentDD[1] = structNew();
 //registerUser.regRequest[1].rUser[1].pData[1].paymentDD[1].bankAccountNr =
"111222";
 //registerUser.regRequest[1].rUser[1].pData[1].paymentDD[1].bankSortCode =
"11223344";
 //registerUser.regRequest[1].rUser[1].pData[1].paymentDD[1].bankName =
"Nordea";
 
 
 registerUser.regRequest[1].rUser[1].pData[1].paymentGUEST = arrayNew(1);
 registerUser.regRequest[1].rUser[1].pData[1].paymentGUEST[1] = structNew();

registerUser.regRequest[1].rUser[1].pData[1].paymentGUEST[1].description =
"blabla";

 
registerUser.regRequest[1].linkID = 155642;
 
 </cfscript>
 
  <cfdump var="#registerUser#">
<cfinvoke
       
webservice="http://wsdl.eu.clickandbuy.com/RMI/2.0/RegistrationManagerbinding.ws
dl"
       method="registerUser"
       returnvariable="RegistrationManager.Registration.RegistrationResponse"
       argumentCollection  = "#registerUser#">
</cfinvoke>   

The java class that is the problem (I think):
* RegistrationManagerRegistrationGender.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.2.1 Jun 14, 2005 (09:15:57 EDT) WSDL2Java emitter.
 */

package com.clickandbuy.RegistrationManager;

public class RegistrationManagerRegistrationGender implements
java.io.Serializable {
    private java.lang.String _value_;
    private static java.util.HashMap _table_ = new java.util.HashMap();

    // Constructor
    protected RegistrationManagerRegistrationGender(java.lang.String value) {
        _value_ = value;
        _table_.put(_value_,this);
    }

    public static final java.lang.String _M = "M";
    public static final java.lang.String _F = "F";
    public static final RegistrationManagerRegistrationGender M = new
RegistrationManagerRegistrationGender(_M);
    public static final RegistrationManagerRegistrationGender F = new
RegistrationManagerRegistrationGender(_F);
    public java.lang.String getValue() { return _value_;}
    public static RegistrationManagerRegistrationGender
fromValue(java.lang.String value)
          throws java.lang.IllegalArgumentException {
        RegistrationManagerRegistrationGender enumeration =
(RegistrationManagerRegistrationGender)
            _table_.get(value);
        if (enumeration==null) throw new java.lang.IllegalArgumentException();
        return enumeration;
    }
    public static RegistrationManagerRegistrationGender
fromString(java.lang.String value)
          throws java.lang.IllegalArgumentException {
        return fromValue(value);
    }
    public boolean equals(java.lang.Object obj) {return (obj == this);}
    public int hashCode() { return toString().hashCode();}
    public java.lang.String toString() { return _value_;}
    public java.lang.Object readResolve() throws java.io.ObjectStreamException
{ return fromValue(_value_);}
    public static org.apache.axis.encoding.Serializer getSerializer(
           java.lang.String mechType,
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return
          new org.apache.axis.encoding.ser.EnumSerializer(
            _javaType, _xmlType);
    }
    public static org.apache.axis.encoding.Deserializer getDeserializer(
           java.lang.String mechType,
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return
          new org.apache.axis.encoding.ser.EnumDeserializer(
            _javaType, _xmlType);
    }
    // Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
        new
org.apache.axis.description.TypeDesc(RegistrationManagerRegistrationGender.class
);

    static {
        typeDesc.setXmlType(new
javax.xml.namespace.QName("https://clickandbuy.com/RegistrationManager/",
"RegistrationManager.Registration.Gender"));
    }
    /**
     * Return type metadata object
     */
    public static org.apache.axis.description.TypeDesc getTypeDesc() {
        return typeDesc;
    }

}

Example of a soap request taken from the documentation:

SOAP Request:
<?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>
  <registerUser xmlns="RegistrationManager.Registration">
    <sellerID>1234567</sellerID>
    <rmPassword>testpass</rmPassword>
    <regRequest>
      <rUser>
        <firstName>James</firstName>
        <lastName>Bond</lastName>
        <middleName></middleName>
        <dateOfBirth>19780101</dateOfBirth>
        <language>de</language>
        <sex>M</sex>
        <addr>
          <email>james@bond.de</email>
          <street>JamesBondstra?e 12</street>
          <street2></street2>
          <city>K?ln</city>
          <ZIP>50969</ZIP>
          <state></state>
          <country>DE</country>
          <telephoneNr>49/998877</telephoneNr>
          <mobileTelNr></mobileTelNr>
          <fax></fax>
          <company></company>
        </addr>
        <pData>
          <paymentDD>
            <bankAccountNr>111222</bankAccountNr>
            <bankSortCode>11223344</bankSortCode>
            <bankName>United Bank</bankName>
          </paymentDD>
        </pData>
      </rUser>
      <linkID>67294</linkID>
    </regRequest>
  </registerUser>
</soapenv:Body>
</soapenv:Envelope>

I have looked at this solution to enumerate, but don?t understand how to use
it:

<cfscript>
ps = CreateObject("java", "java.util.Properties");
ps.setProperty("0", "Orange");
ps.setProperty("1", "Mango");
keys = ps.keys();
while (keys.hasMoreElements()){
k = keys.nextElement();
v = ps.getProperty
insuractive - 23 Apr 2007 22:36 GMT
What element is a enumerated type?
goransv - 24 Apr 2007 13:35 GMT
In the documentation gender is defined as a enumerated type
(registerUser.regRequest[1].rUser[1].sex[1].Gender = "M";).

Now I also have a php example, and it seams quit easy to implement, I hope.
But in the other hand it is using nuSOAP lib that maybe takes care of the
tricky stuff..

If I dont manage to get it working soon, I go for the php solution, and have
the data source as the bridge between cf and php.  

<?php
# $Id: wsdlclient1.php,v 1.2 2004/03/15 23:06:17 snichol Exp $
# WSDL client for the customer registration over SOAP.
# ClickandBuy Integration Sample
# created 11.04.2007

# Service: WSDL
# Payload: document/literal
# Transport: https
 
// Import NuSoap Lib
require_once('lib/nusoap.php');

// Defined customer info
$firstName     = 'Luke';
$lastName     = 'Wallwin';
$middleName     = '';
$dateOfBirth     = '19790101';
$language     = 'en';
$sex         = 'M';
$email         = 'rmi001@tester.com';
$street     = 'Im MediaPark 5';
$street2     = '';
$city         = 'Koeln';
$ZIP         = '50670';
$state         = 'NRW';
$country     = 'DE';
$telephoneNr     =' 1234567890';
$mobileTelNr     = '';
$fax         = '';
$company     = '';

// Defined payment info
$bankAccountNr    = '12345678';
$bankSortCode    = '123456';
$bankName    = 'Bank Name';

// address array
$addr = array(
'email'     => $email,
'street'    => $street,
'street2'     => $street2,
'city'        => $city,
'ZIP'         => $ZIP,
'state'     => $state,
'country'     => $country,
'telephoneNr'     => $telephoneNr,
'mobileTelNr'     => $mobileTelNr,
'fax'         => $fax,
'company'     => $company
);

// paymentCC element array
$paymentDD = array(
'bankAccountNr' => $bankAccountNr,
'bankSortCode'     => $bankSortCode,
'bankName'     => $bankName
);

// pData element array
$pData = array(
'paymentDD'     => $paymentDD
);

// SellerID of your ClickandBuy Merchant Account
$sellerID     = 1542382;
// Transactionmanager Password
$rmPassword     ='******';
// Purchase link to register customer against
$linkID     = 100673;

// rUser element array
$rUser = array(
'firstName'    => $firstName,
'lastName'    => $lastName,
'middleName'    => $middleName,
'dateOfBirth'     => $dateOfBirth,
'language'     => $language,
'sex'         => $sex,
'addr'        => $addr,
'pData'        => $pData
);

// RegistrationManager.Registration.RegistrationRequest
$regRequest = array(
'rUser'     => $rUser,
'linkID'     => $linkID
);

// Create Client Object

$client = new
soapclient('http://wsdl.eu.clickandbuy.com/RMI/2.1/RegistrationManagerbinding.ws
dl',true);
echo ('<h2>Application Started...</h2>');

$err = $client->getError();

if ($err) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
}
 
// Begin Customer Registration

 $subclient = array(
 'sellerID'     => $sellerID,
 'rmPassword'     => $rmPassword,
 'regRequest'     => $regRequest
 );
print_r($subclient);

// Start Soap Request
$result = $client->call('registerUser',$subclient);

// Result
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Display the error => Array
    $err = $client->getError();
    if ($err) {
        // Display the error => Array
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result => Array
        echo '<h2>Result</h2><pre>';
        print_r($result);
        echo '</pre>';
    }

// Output
 
echo '<br><br><br><br>';
echo '<h3>My Request</h3><pre>' . htmlspecialchars($client->request,
ENT_QUOTES) . '</pre>';
echo '<h3>ClickandBuy Response</h3><pre>' .
htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
echo '<h3>Debug</h3><pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES)
. '</pre></font>';
}

?>
insuractive - 24 Apr 2007 16:14 GMT
Have you tried this:

<cfscript>
ps = CreateObject("java", "java.util.Properties");
ps.setProperty("0", "M");
ps.setProperty("1", "F");
myProperty = ps.getProperty(0);

registerUser.regRequest[1].rUser[1].sex[1].Gender = myProperty;
</cfscript>
goransv - 25 Apr 2007 08:50 GMT
Yep! No success, same error message.
insuractive - 25 Apr 2007 15:34 GMT
Have you tried running the PHP script to see if that works?
goransv - 30 Apr 2007 10:38 GMT
I have managed to get the php script work. But first I got one error message that I needed openSSL or CURL. After I installed openssl and curl I got it working.
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.