Hello Taher ,
As suggested i shifted this discussion to the user list from dev. As you expected the product key has a value which is a struct. This maps to java.util.HashMap but the validator expects it to be a GenericValue and hence it does not hands it over to the service. $ ./007-get-price.pl PROD_SY87B9B8MY 2018/03/23 15:34:31 -------------------------------------------------------------------------------- 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" encoding="UTF-8"?> REQ >>>>>>>>> <methodCall> REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> REQ >>>>>>>>> <params> REQ >>>>>>>>> <param> REQ >>>>>>>>> <value> REQ >>>>>>>>> <struct> REQ >>>>>>>>> <member> REQ >>>>>>>>> <name>login.password</name> REQ >>>>>>>>> <value> REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> REQ >>>>>>>>> </value> REQ >>>>>>>>> </member> REQ >>>>>>>>> <member> REQ >>>>>>>>> <name>product</name> REQ >>>>>>>>> <value> REQ >>>>>>>>> <struct> REQ >>>>>>>>> <member> REQ >>>>>>>>> <name>productId</name> REQ >>>>>>>>> <value> REQ >>>>>>>>> <string><![CDATA[PROD_SY87B9B8MY]]></string> REQ >>>>>>>>> </value> REQ >>>>>>>>> </member> REQ >>>>>>>>> </struct> REQ >>>>>>>>> </value> REQ >>>>>>>>> </member> REQ >>>>>>>>> <member> REQ >>>>>>>>> <name>login.username</name> REQ >>>>>>>>> <value> REQ >>>>>>>>> <string><![CDATA[admin]]></string> REQ >>>>>>>>> </value> REQ >>>>>>>>> </member> REQ >>>>>>>>> </struct> REQ >>>>>>>>> </value> REQ >>>>>>>>> </param> REQ >>>>>>>>> </params> REQ >>>>>>>>> </methodCall> 2018/03/23 15:34:31 -------------------------------------------------------------------------------- 2018/03/23 15:34:31 -------------------------------------------------------------------------------- 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" encoding="UTF-8"?> RES <<<<<<<<< <methodResponse RES <<<<<<<<< xmlns:ex=" http://ws.apache.org/xmlrpc/namespaces/extensions"> RES <<<<<<<<< <fault> RES <<<<<<<<< <value> RES <<<<<<<<< <struct> RES <<<<<<<<< <member> RES <<<<<<<<< <name>faultCode</name> RES <<<<<<<<< <value> RES <<<<<<<<< <i4>0</i4> RES <<<<<<<<< </value> RES <<<<<<<<< </member> RES <<<<<<<<< <member> RES <<<<<<<<< <name>faultString</name> RES <<<<<<<<< <value>Type check failed for field RES <<<<<<<<< [calculateProductPrice.product]; expected type is RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; actual type is RES <<<<<<<<< [java.util.HashMap]</value> RES <<<<<<<<< </member> RES <<<<<<<<< </struct> RES <<<<<<<<< </value> RES <<<<<<<<< </fault> RES <<<<<<<<< </methodResponse> 2018/03/23 15:34:31 -------------------------------------------------------------------------------- Service: calculateProductPrice faultString:Type check failed for field [calculateProductPrice.product]; expected type is [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] ======================================== $ cat 007-get-price.pl #!/usr/bin/perl use OFBizClient; my $ofbiz_client = OFBizClient->new( url => ' https://your_ofbiz_server_here/webtools/control/xmlrpc' , username=>'admin' , password => 'ofbiz' ); my $productId = 'PROD_SY87B9B8MY'; $ofbiz_client->call('calculateProductPrice' , { product => { productId => $productId } } ); ======================================== |
Hi Jacques / List ,
I face the very same problem with SOAP too , pls have a look if the SOAP message is OK. Please suggest any edits to the SOAP message which i may try. <!-- start of soap --> <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"> <soap:Body> <ns1:calculateProductPrice> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" xsi:type="soapenc:Array"> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> <ns1:map-Key> <ns1:std-String value="login.username" /> </ns1:map-Key> <ns1:map-Value> <ns1:std-String value="admin" /> </ns1:map-Value> </ns1:map-Entry> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> <ns1:map-Key> <ns1:std-String value="login.password" /> </ns1:map-Key> <ns1:map-Value> <ns1:std-String value="ofbiz" /> </ns1:map-Value> </ns1:map-Entry> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> <ns1:map-Key> <ns1:std-String value="product" /> </ns1:map-Key> <ns1:map-Value> <ns1:map-Map> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> <ns1:map-Key> <ns1:std-String value="productId" /> </ns1:map-Key> <ns1:map-Value> <ns1:std-String value="PROD_SY87B9B8MY" /> </ns1:map-Value> </ns1:map-Entry> </ns1:map-Map> </ns1:map-Value> </ns1:map-Entry> </ns1:map-Map> </ns1:calculateProductPrice> </soap:Body> </soap:Envelope> <!-- end of soap --> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 |ModelService |E| [ModelService.validate] : {calculateProductPrice} : (IN) Required test error: org.apache.ofbiz.service.ServiceValidationException: Type check failed for field [calculateProductPrice.product]; expected type is [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 |ServiceDispatcher |E| Incoming context (in runSync : calculateProductPrice) does not match expected requirements org.apache.ofbiz.service.ServiceValidationException: Type check failed for field [calculateProductPrice.product]; expected type is [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] regds mallah. On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email]> wrote: > > Hello Taher , > > As suggested i shifted this discussion to the user list from dev. > > As you expected the product key has a value which is a > struct. This maps to java.util.HashMap but the validator > expects it to be a GenericValue and hence it does not hands it over > to the service. > > > $ ./007-get-price.pl PROD_SY87B9B8MY > 2018/03/23 15:34:31 ------------------------------ > -------------------------------------------------- > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" encoding="UTF-8"?> > REQ >>>>>>>>> <methodCall> > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> > REQ >>>>>>>>> <params> > REQ >>>>>>>>> <param> > REQ >>>>>>>>> <value> > REQ >>>>>>>>> <struct> > REQ >>>>>>>>> <member> > REQ >>>>>>>>> <name>login.password</name> > REQ >>>>>>>>> <value> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> > REQ >>>>>>>>> </value> > REQ >>>>>>>>> </member> > REQ >>>>>>>>> <member> > REQ >>>>>>>>> <name>product</name> > REQ >>>>>>>>> <value> > REQ >>>>>>>>> <struct> > REQ >>>>>>>>> <member> > REQ >>>>>>>>> <name>productId</name> > REQ >>>>>>>>> <value> > REQ >>>>>>>>> <string><![CDATA[PROD_ > SY87B9B8MY]]></string> > REQ >>>>>>>>> </value> > REQ >>>>>>>>> </member> > REQ >>>>>>>>> </struct> > REQ >>>>>>>>> </value> > REQ >>>>>>>>> </member> > REQ >>>>>>>>> <member> > REQ >>>>>>>>> <name>login.username</name> > REQ >>>>>>>>> <value> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> > REQ >>>>>>>>> </value> > REQ >>>>>>>>> </member> > REQ >>>>>>>>> </struct> > REQ >>>>>>>>> </value> > REQ >>>>>>>>> </param> > REQ >>>>>>>>> </params> > REQ >>>>>>>>> </methodCall> > 2018/03/23 15:34:31 ------------------------------ > -------------------------------------------------- > 2018/03/23 15:34:31 ------------------------------ > -------------------------------------------------- > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" encoding="UTF-8"?> > RES <<<<<<<<< <methodResponse > RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ > extensions"> > RES <<<<<<<<< <fault> > RES <<<<<<<<< <value> > RES <<<<<<<<< <struct> > RES <<<<<<<<< <member> > RES <<<<<<<<< <name>faultCode</name> > RES <<<<<<<<< <value> > RES <<<<<<<<< <i4>0</i4> > RES <<<<<<<<< </value> > RES <<<<<<<<< </member> > RES <<<<<<<<< <member> > RES <<<<<<<<< <name>faultString</name> > RES <<<<<<<<< <value>Type check failed for field > RES <<<<<<<<< [calculateProductPrice.product]; expected > type is > RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; > actual type is > RES <<<<<<<<< [java.util.HashMap]</value> > RES <<<<<<<<< </member> > RES <<<<<<<<< </struct> > RES <<<<<<<<< </value> > RES <<<<<<<<< </fault> > RES <<<<<<<<< </methodResponse> > 2018/03/23 15:34:31 ------------------------------ > -------------------------------------------------- > Service: calculateProductPrice faultString:Type check failed for field > [calculateProductPrice.product]; expected type is > [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] > > ======================================== > $ cat 007-get-price.pl > > #!/usr/bin/perl > > use OFBizClient; > > my $ofbiz_client = OFBizClient->new( > url => 'https://your_ofbiz_server_ > here/webtools/control/xmlrpc' , > username=>'admin' , > password => 'ofbiz' > ); > > my $productId = 'PROD_SY87B9B8MY'; > $ofbiz_client->call('calculateProductPrice' , { product => { productId > => $productId } } ); > > ======================================== > > > |
Hi Rajesh,
SOAP request or XMLRPC request both uses the standard format conversion basic/regular java supports. That means if you are sending bunch of key value pair wrt a key ... in your case key is product. Then it will always convert it into the Map. So what general practices followed for xml data exchange is already exists. To have generic value or any other class value in your service IN parameter, you may need to add converter before passing it to service for invoke. That means, your checkMap method must be enabled for this type of conversion. Also this method will be invoked on IN parameter type. Please see XmlRpcEventHandler.getContext() for more details. This should be quick one and should resolve your problem, which enable the conversion of target type. A generic approach also welcome for contribution. :-) HTH! Regards, -- Rishi Solanki Sr Manager, Enterprise Software Development HotWax Systems Pvt. Ltd. Direct: +91-9893287847 http://www.hotwaxsystems.com www.hotwax.co On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah <[hidden email]> wrote: > Hi Jacques / List , > > I face the very same problem with SOAP too , pls have a look if the SOAP > message is OK. Please suggest any edits to the SOAP message which i may > try. > > > <!-- start of soap --> > > <?xml version="1.0" encoding="UTF-8"?> > <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ > encoding/" > xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" > http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" > http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" > http://www.w3.org/2001/XMLSchema" xmlns:xsi=" > http://www.w3.org/2001/XMLSchema-instance"> > <soap:Body> > <ns1:calculateProductPrice> > <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" > xsi:type="soapenc:Array"> > <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > xsi:type="soapenc:Array"> > <ns1:map-Key> > <ns1:std-String value="login.username" /> > </ns1:map-Key> > <ns1:map-Value> > <ns1:std-String value="admin" /> > </ns1:map-Value> > </ns1:map-Entry> > <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > xsi:type="soapenc:Array"> > <ns1:map-Key> > <ns1:std-String value="login.password" /> > </ns1:map-Key> > <ns1:map-Value> > <ns1:std-String value="ofbiz" /> > </ns1:map-Value> > </ns1:map-Entry> > <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > xsi:type="soapenc:Array"> > <ns1:map-Key> > <ns1:std-String value="product" /> > </ns1:map-Key> > <ns1:map-Value> > <ns1:map-Map> > <ns1:map-Entry > soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> > <ns1:map-Key> > <ns1:std-String value="productId" /> > </ns1:map-Key> > <ns1:map-Value> > <ns1:std-String value="PROD_SY87B9B8MY" > /> > </ns1:map-Value> > </ns1:map-Entry> > </ns1:map-Map> > </ns1:map-Value> > </ns1:map-Entry> > </ns1:map-Map> > </ns1:calculateProductPrice> > </soap:Body> > </soap:Envelope> > > <!-- end of soap --> > > 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > |ModelService |E| [ModelService.validate] : > {calculateProductPrice} : (IN) Required test error: > org.apache.ofbiz.service.ServiceValidationException: Type check failed for > field [calculateProductPrice.product]; expected type is > [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] > 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > |ServiceDispatcher |E| Incoming context (in runSync : > calculateProductPrice) does not match expected requirements > org.apache.ofbiz.service.ServiceValidationException: Type check failed for > field [calculateProductPrice.product]; expected type is > [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] > > > > regds > mallah. > > > > On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email]> > wrote: > > > > > Hello Taher , > > > > As suggested i shifted this discussion to the user list from dev. > > > > As you expected the product key has a value which is a > > struct. This maps to java.util.HashMap but the validator > > expects it to be a GenericValue and hence it does not hands it over > > to the service. > > > > > > $ ./007-get-price.pl PROD_SY87B9B8MY > > 2018/03/23 15:34:31 ------------------------------ > > -------------------------------------------------- > > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" > encoding="UTF-8"?> > > REQ >>>>>>>>> <methodCall> > > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> > > REQ >>>>>>>>> <params> > > REQ >>>>>>>>> <param> > > REQ >>>>>>>>> <value> > > REQ >>>>>>>>> <struct> > > REQ >>>>>>>>> <member> > > REQ >>>>>>>>> <name>login.password</name> > > REQ >>>>>>>>> <value> > > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> > > REQ >>>>>>>>> </value> > > REQ >>>>>>>>> </member> > > REQ >>>>>>>>> <member> > > REQ >>>>>>>>> <name>product</name> > > REQ >>>>>>>>> <value> > > REQ >>>>>>>>> <struct> > > REQ >>>>>>>>> <member> > > REQ >>>>>>>>> <name>productId</name> > > REQ >>>>>>>>> <value> > > REQ >>>>>>>>> <string><![CDATA[PROD_ > > SY87B9B8MY]]></string> > > REQ >>>>>>>>> </value> > > REQ >>>>>>>>> </member> > > REQ >>>>>>>>> </struct> > > REQ >>>>>>>>> </value> > > REQ >>>>>>>>> </member> > > REQ >>>>>>>>> <member> > > REQ >>>>>>>>> <name>login.username</name> > > REQ >>>>>>>>> <value> > > REQ >>>>>>>>> <string><![CDATA[admin]]></string> > > REQ >>>>>>>>> </value> > > REQ >>>>>>>>> </member> > > REQ >>>>>>>>> </struct> > > REQ >>>>>>>>> </value> > > REQ >>>>>>>>> </param> > > REQ >>>>>>>>> </params> > > REQ >>>>>>>>> </methodCall> > > 2018/03/23 15:34:31 ------------------------------ > > -------------------------------------------------- > > 2018/03/23 15:34:31 ------------------------------ > > -------------------------------------------------- > > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" > encoding="UTF-8"?> > > RES <<<<<<<<< <methodResponse > > RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ > > extensions"> > > RES <<<<<<<<< <fault> > > RES <<<<<<<<< <value> > > RES <<<<<<<<< <struct> > > RES <<<<<<<<< <member> > > RES <<<<<<<<< <name>faultCode</name> > > RES <<<<<<<<< <value> > > RES <<<<<<<<< <i4>0</i4> > > RES <<<<<<<<< </value> > > RES <<<<<<<<< </member> > > RES <<<<<<<<< <member> > > RES <<<<<<<<< <name>faultString</name> > > RES <<<<<<<<< <value>Type check failed for field > > RES <<<<<<<<< [calculateProductPrice.product]; expected > > type is > > RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; > > actual type is > > RES <<<<<<<<< [java.util.HashMap]</value> > > RES <<<<<<<<< </member> > > RES <<<<<<<<< </struct> > > RES <<<<<<<<< </value> > > RES <<<<<<<<< </fault> > > RES <<<<<<<<< </methodResponse> > > 2018/03/23 15:34:31 ------------------------------ > > -------------------------------------------------- > > Service: calculateProductPrice faultString:Type check failed for field > > [calculateProductPrice.product]; expected type is > > [org.apache.ofbiz.entity.GenericValue]; actual type is > [java.util.HashMap] > > > > ======================================== > > $ cat 007-get-price.pl > > > > #!/usr/bin/perl > > > > use OFBizClient; > > > > my $ofbiz_client = OFBizClient->new( > > url => 'https://your_ofbiz_server_ > > here/webtools/control/xmlrpc' , > > username=>'admin' , > > password => 'ofbiz' > > ); > > > > my $productId = 'PROD_SY87B9B8MY'; > > $ofbiz_client->call('calculateProductPrice' , { product => { productId > > => $productId } } ); > > > > ======================================== > > > > > > > |
Administrator
|
Thanks Rishi,
I also checked yesterday and I agree with you, SOAP is not doing more for that. Jacques Le 24/03/2018 à 09:51, Rishi Solanki a écrit : > Hi Rajesh, > SOAP request or XMLRPC request both uses the standard format conversion > basic/regular java supports. That means if you are sending bunch of key > value pair wrt a key ... in your case key is product. Then it will always > convert it into the Map. So what general practices followed for xml data > exchange is already exists. > > To have generic value or any other class value in your service IN > parameter, you may need to add converter before passing it to service for > invoke. That means, your checkMap method must be enabled for this type of > conversion. Also this method will be invoked on IN parameter type. Please > see XmlRpcEventHandler.getContext() for more details. > > This should be quick one and should resolve your problem, which enable the > conversion of target type. A generic approach also welcome for > contribution. :-) > > HTH! > > Regards, > -- > > Rishi Solanki > Sr Manager, Enterprise Software Development > HotWax Systems Pvt. Ltd. > Direct: +91-9893287847 > http://www.hotwaxsystems.com > www.hotwax.co > > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah <[hidden email]> > wrote: > >> Hi Jacques / List , >> >> I face the very same problem with SOAP too , pls have a look if the SOAP >> message is OK. Please suggest any edits to the SOAP message which i may >> try. >> >> >> <!-- start of soap --> >> >> <?xml version="1.0" encoding="UTF-8"?> >> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ >> encoding/" >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" >> http://www.w3.org/2001/XMLSchema-instance"> >> <soap:Body> >> <ns1:calculateProductPrice> >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" >> xsi:type="soapenc:Array"> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="login.username" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="admin" /> >> </ns1:map-Value> >> </ns1:map-Entry> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="login.password" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="ofbiz" /> >> </ns1:map-Value> >> </ns1:map-Entry> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="product" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:map-Map> >> <ns1:map-Entry >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="productId" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="PROD_SY87B9B8MY" >> /> >> </ns1:map-Value> >> </ns1:map-Entry> >> </ns1:map-Map> >> </ns1:map-Value> >> </ns1:map-Entry> >> </ns1:map-Map> >> </ns1:calculateProductPrice> >> </soap:Body> >> </soap:Envelope> >> >> <!-- end of soap --> >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> |ModelService |E| [ModelService.validate] : >> {calculateProductPrice} : (IN) Required test error: >> org.apache.ofbiz.service.ServiceValidationException: Type check failed for >> field [calculateProductPrice.product]; expected type is >> [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> |ServiceDispatcher |E| Incoming context (in runSync : >> calculateProductPrice) does not match expected requirements >> org.apache.ofbiz.service.ServiceValidationException: Type check failed for >> field [calculateProductPrice.product]; expected type is >> [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] >> >> >> >> regds >> mallah. >> >> >> >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email]> >> wrote: >> >>> Hello Taher , >>> >>> As suggested i shifted this discussion to the user list from dev. >>> >>> As you expected the product key has a value which is a >>> struct. This maps to java.util.HashMap but the validator >>> expects it to be a GenericValue and hence it does not hands it over >>> to the service. >>> >>> >>> $ ./007-get-price.pl PROD_SY87B9B8MY >>> 2018/03/23 15:34:31 ------------------------------ >>> -------------------------------------------------- >>> 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" >> encoding="UTF-8"?> >>> REQ >>>>>>>>> <methodCall> >>> REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> >>> REQ >>>>>>>>> <params> >>> REQ >>>>>>>>> <param> >>> REQ >>>>>>>>> <value> >>> REQ >>>>>>>>> <struct> >>> REQ >>>>>>>>> <member> >>> REQ >>>>>>>>> <name>login.password</name> >>> REQ >>>>>>>>> <value> >>> REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> >>> REQ >>>>>>>>> </value> >>> REQ >>>>>>>>> </member> >>> REQ >>>>>>>>> <member> >>> REQ >>>>>>>>> <name>product</name> >>> REQ >>>>>>>>> <value> >>> REQ >>>>>>>>> <struct> >>> REQ >>>>>>>>> <member> >>> REQ >>>>>>>>> <name>productId</name> >>> REQ >>>>>>>>> <value> >>> REQ >>>>>>>>> <string><![CDATA[PROD_ >>> SY87B9B8MY]]></string> >>> REQ >>>>>>>>> </value> >>> REQ >>>>>>>>> </member> >>> REQ >>>>>>>>> </struct> >>> REQ >>>>>>>>> </value> >>> REQ >>>>>>>>> </member> >>> REQ >>>>>>>>> <member> >>> REQ >>>>>>>>> <name>login.username</name> >>> REQ >>>>>>>>> <value> >>> REQ >>>>>>>>> <string><![CDATA[admin]]></string> >>> REQ >>>>>>>>> </value> >>> REQ >>>>>>>>> </member> >>> REQ >>>>>>>>> </struct> >>> REQ >>>>>>>>> </value> >>> REQ >>>>>>>>> </param> >>> REQ >>>>>>>>> </params> >>> REQ >>>>>>>>> </methodCall> >>> 2018/03/23 15:34:31 ------------------------------ >>> -------------------------------------------------- >>> 2018/03/23 15:34:31 ------------------------------ >>> -------------------------------------------------- >>> 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" >> encoding="UTF-8"?> >>> RES <<<<<<<<< <methodResponse >>> RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ >>> extensions"> >>> RES <<<<<<<<< <fault> >>> RES <<<<<<<<< <value> >>> RES <<<<<<<<< <struct> >>> RES <<<<<<<<< <member> >>> RES <<<<<<<<< <name>faultCode</name> >>> RES <<<<<<<<< <value> >>> RES <<<<<<<<< <i4>0</i4> >>> RES <<<<<<<<< </value> >>> RES <<<<<<<<< </member> >>> RES <<<<<<<<< <member> >>> RES <<<<<<<<< <name>faultString</name> >>> RES <<<<<<<<< <value>Type check failed for field >>> RES <<<<<<<<< [calculateProductPrice.product]; expected >>> type is >>> RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; >>> actual type is >>> RES <<<<<<<<< [java.util.HashMap]</value> >>> RES <<<<<<<<< </member> >>> RES <<<<<<<<< </struct> >>> RES <<<<<<<<< </value> >>> RES <<<<<<<<< </fault> >>> RES <<<<<<<<< </methodResponse> >>> 2018/03/23 15:34:31 ------------------------------ >>> -------------------------------------------------- >>> Service: calculateProductPrice faultString:Type check failed for field >>> [calculateProductPrice.product]; expected type is >>> [org.apache.ofbiz.entity.GenericValue]; actual type is >> [java.util.HashMap] >>> ======================================== >>> $ cat 007-get-price.pl >>> >>> #!/usr/bin/perl >>> >>> use OFBizClient; >>> >>> my $ofbiz_client = OFBizClient->new( >>> url => 'https://your_ofbiz_server_ >>> here/webtools/control/xmlrpc' , >>> username=>'admin' , >>> password => 'ofbiz' >>> ); >>> >>> my $productId = 'PROD_SY87B9B8MY'; >>> $ofbiz_client->call('calculateProductPrice' , { product => { productId >>> => $productId } } ); >>> >>> ======================================== >>> >>> >>> |
In reply to this post by Rishi Solanki
Thinking out loud, maybe one solution in here is to update the logic
in ModelService such that a map is automatically casted to a GenericValue, or any object that is "instanceOf" would pass through. The problem of course is how to carry "state" in these objects, which is the reason why I dislike passing objects to services. So another question, I see both SOAP and XML-RPC messages here, but how are you invoking them? Is it just a simple URL or what? On Sat, Mar 24, 2018 at 11:51 AM, Rishi Solanki <[hidden email]> wrote: > Hi Rajesh, > SOAP request or XMLRPC request both uses the standard format conversion > basic/regular java supports. That means if you are sending bunch of key > value pair wrt a key ... in your case key is product. Then it will always > convert it into the Map. So what general practices followed for xml data > exchange is already exists. > > To have generic value or any other class value in your service IN > parameter, you may need to add converter before passing it to service for > invoke. That means, your checkMap method must be enabled for this type of > conversion. Also this method will be invoked on IN parameter type. Please > see XmlRpcEventHandler.getContext() for more details. > > This should be quick one and should resolve your problem, which enable the > conversion of target type. A generic approach also welcome for > contribution. :-) > > HTH! > > Regards, > -- > > Rishi Solanki > Sr Manager, Enterprise Software Development > HotWax Systems Pvt. Ltd. > Direct: +91-9893287847 > http://www.hotwaxsystems.com > www.hotwax.co > > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah <[hidden email]> > wrote: > >> Hi Jacques / List , >> >> I face the very same problem with SOAP too , pls have a look if the SOAP >> message is OK. Please suggest any edits to the SOAP message which i may >> try. >> >> >> <!-- start of soap --> >> >> <?xml version="1.0" encoding="UTF-8"?> >> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ >> encoding/" >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" >> http://www.w3.org/2001/XMLSchema-instance"> >> <soap:Body> >> <ns1:calculateProductPrice> >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" >> xsi:type="soapenc:Array"> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="login.username" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="admin" /> >> </ns1:map-Value> >> </ns1:map-Entry> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="login.password" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="ofbiz" /> >> </ns1:map-Value> >> </ns1:map-Entry> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="product" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:map-Map> >> <ns1:map-Entry >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> >> <ns1:map-Key> >> <ns1:std-String value="productId" /> >> </ns1:map-Key> >> <ns1:map-Value> >> <ns1:std-String value="PROD_SY87B9B8MY" >> /> >> </ns1:map-Value> >> </ns1:map-Entry> >> </ns1:map-Map> >> </ns1:map-Value> >> </ns1:map-Entry> >> </ns1:map-Map> >> </ns1:calculateProductPrice> >> </soap:Body> >> </soap:Envelope> >> >> <!-- end of soap --> >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> |ModelService |E| [ModelService.validate] : >> {calculateProductPrice} : (IN) Required test error: >> org.apache.ofbiz.service.ServiceValidationException: Type check failed for >> field [calculateProductPrice.product]; expected type is >> [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> |ServiceDispatcher |E| Incoming context (in runSync : >> calculateProductPrice) does not match expected requirements >> org.apache.ofbiz.service.ServiceValidationException: Type check failed for >> field [calculateProductPrice.product]; expected type is >> [org.apache.ofbiz.entity.GenericValue]; actual type is [java.util.HashMap] >> >> >> >> regds >> mallah. >> >> >> >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email]> >> wrote: >> >> > >> > Hello Taher , >> > >> > As suggested i shifted this discussion to the user list from dev. >> > >> > As you expected the product key has a value which is a >> > struct. This maps to java.util.HashMap but the validator >> > expects it to be a GenericValue and hence it does not hands it over >> > to the service. >> > >> > >> > $ ./007-get-price.pl PROD_SY87B9B8MY >> > 2018/03/23 15:34:31 ------------------------------ >> > -------------------------------------------------- >> > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" >> encoding="UTF-8"?> >> > REQ >>>>>>>>> <methodCall> >> > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> >> > REQ >>>>>>>>> <params> >> > REQ >>>>>>>>> <param> >> > REQ >>>>>>>>> <value> >> > REQ >>>>>>>>> <struct> >> > REQ >>>>>>>>> <member> >> > REQ >>>>>>>>> <name>login.password</name> >> > REQ >>>>>>>>> <value> >> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> >> > REQ >>>>>>>>> </value> >> > REQ >>>>>>>>> </member> >> > REQ >>>>>>>>> <member> >> > REQ >>>>>>>>> <name>product</name> >> > REQ >>>>>>>>> <value> >> > REQ >>>>>>>>> <struct> >> > REQ >>>>>>>>> <member> >> > REQ >>>>>>>>> <name>productId</name> >> > REQ >>>>>>>>> <value> >> > REQ >>>>>>>>> <string><![CDATA[PROD_ >> > SY87B9B8MY]]></string> >> > REQ >>>>>>>>> </value> >> > REQ >>>>>>>>> </member> >> > REQ >>>>>>>>> </struct> >> > REQ >>>>>>>>> </value> >> > REQ >>>>>>>>> </member> >> > REQ >>>>>>>>> <member> >> > REQ >>>>>>>>> <name>login.username</name> >> > REQ >>>>>>>>> <value> >> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> >> > REQ >>>>>>>>> </value> >> > REQ >>>>>>>>> </member> >> > REQ >>>>>>>>> </struct> >> > REQ >>>>>>>>> </value> >> > REQ >>>>>>>>> </param> >> > REQ >>>>>>>>> </params> >> > REQ >>>>>>>>> </methodCall> >> > 2018/03/23 15:34:31 ------------------------------ >> > -------------------------------------------------- >> > 2018/03/23 15:34:31 ------------------------------ >> > -------------------------------------------------- >> > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" >> encoding="UTF-8"?> >> > RES <<<<<<<<< <methodResponse >> > RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ >> > extensions"> >> > RES <<<<<<<<< <fault> >> > RES <<<<<<<<< <value> >> > RES <<<<<<<<< <struct> >> > RES <<<<<<<<< <member> >> > RES <<<<<<<<< <name>faultCode</name> >> > RES <<<<<<<<< <value> >> > RES <<<<<<<<< <i4>0</i4> >> > RES <<<<<<<<< </value> >> > RES <<<<<<<<< </member> >> > RES <<<<<<<<< <member> >> > RES <<<<<<<<< <name>faultString</name> >> > RES <<<<<<<<< <value>Type check failed for field >> > RES <<<<<<<<< [calculateProductPrice.product]; expected >> > type is >> > RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; >> > actual type is >> > RES <<<<<<<<< [java.util.HashMap]</value> >> > RES <<<<<<<<< </member> >> > RES <<<<<<<<< </struct> >> > RES <<<<<<<<< </value> >> > RES <<<<<<<<< </fault> >> > RES <<<<<<<<< </methodResponse> >> > 2018/03/23 15:34:31 ------------------------------ >> > -------------------------------------------------- >> > Service: calculateProductPrice faultString:Type check failed for field >> > [calculateProductPrice.product]; expected type is >> > [org.apache.ofbiz.entity.GenericValue]; actual type is >> [java.util.HashMap] >> > >> > ======================================== >> > $ cat 007-get-price.pl >> > >> > #!/usr/bin/perl >> > >> > use OFBizClient; >> > >> > my $ofbiz_client = OFBizClient->new( >> > url => 'https://your_ofbiz_server_ >> > here/webtools/control/xmlrpc' , >> > username=>'admin' , >> > password => 'ofbiz' >> > ); >> > >> > my $productId = 'PROD_SY87B9B8MY'; >> > $ofbiz_client->call('calculateProductPrice' , { product => { productId >> > => $productId } } ); >> > >> > ======================================== >> > >> > >> > >> |
Hello Rishi / Jacques /Taher ,
Thanks for the responses. I feel a generic solution should be devised and I want to put some effort so that an incoming Map is converted to a GenericValue . Which is a more appropriate place ModelService or XmlRpcEventHandler and where can the change be done in a relatively easier fashion ? regds mallah On Sat, Mar 24, 2018 at 2:32 PM, Taher Alkhateeb <[hidden email] > wrote: > Thinking out loud, maybe one solution in here is to update the logic > in ModelService such that a map is automatically casted to a > GenericValue, or any object that is "instanceOf" would pass through. > The problem of course is how to carry "state" in these objects, which > is the reason why I dislike passing objects to services. > > So another question, I see both SOAP and XML-RPC messages here, but > how are you invoking them? Is it just a simple URL or what? > > On Sat, Mar 24, 2018 at 11:51 AM, Rishi Solanki <[hidden email]> > wrote: > > Hi Rajesh, > > SOAP request or XMLRPC request both uses the standard format conversion > > basic/regular java supports. That means if you are sending bunch of key > > value pair wrt a key ... in your case key is product. Then it will always > > convert it into the Map. So what general practices followed for xml data > > exchange is already exists. > > > > To have generic value or any other class value in your service IN > > parameter, you may need to add converter before passing it to service for > > invoke. That means, your checkMap method must be enabled for this type of > > conversion. Also this method will be invoked on IN parameter type. Please > > see XmlRpcEventHandler.getContext() for more details. > > > > This should be quick one and should resolve your problem, which enable > the > > conversion of target type. A generic approach also welcome for > > contribution. :-) > > > > HTH! > > > > Regards, > > -- > > > > Rishi Solanki > > Sr Manager, Enterprise Software Development > > HotWax Systems Pvt. Ltd. > > Direct: +91-9893287847 > > http://www.hotwaxsystems.com > > www.hotwax.co > > > > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah <[hidden email] > > > > wrote: > > > >> Hi Jacques / List , > >> > >> I face the very same problem with SOAP too , pls have a look if the SOAP > >> message is OK. Please suggest any edits to the SOAP message which i may > >> try. > >> > >> > >> <!-- start of soap --> > >> > >> <?xml version="1.0" encoding="UTF-8"?> > >> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ > >> encoding/" > >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" > >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" > >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" > >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" > >> http://www.w3.org/2001/XMLSchema-instance"> > >> <soap:Body> > >> <ns1:calculateProductPrice> > >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" > >> xsi:type="soapenc:Array"> > >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> xsi:type="soapenc:Array"> > >> <ns1:map-Key> > >> <ns1:std-String value="login.username" /> > >> </ns1:map-Key> > >> <ns1:map-Value> > >> <ns1:std-String value="admin" /> > >> </ns1:map-Value> > >> </ns1:map-Entry> > >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> xsi:type="soapenc:Array"> > >> <ns1:map-Key> > >> <ns1:std-String value="login.password" /> > >> </ns1:map-Key> > >> <ns1:map-Value> > >> <ns1:std-String value="ofbiz" /> > >> </ns1:map-Value> > >> </ns1:map-Entry> > >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> xsi:type="soapenc:Array"> > >> <ns1:map-Key> > >> <ns1:std-String value="product" /> > >> </ns1:map-Key> > >> <ns1:map-Value> > >> <ns1:map-Map> > >> <ns1:map-Entry > >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> > >> <ns1:map-Key> > >> <ns1:std-String value="productId" /> > >> </ns1:map-Key> > >> <ns1:map-Value> > >> <ns1:std-String > value="PROD_SY87B9B8MY" > >> /> > >> </ns1:map-Value> > >> </ns1:map-Entry> > >> </ns1:map-Map> > >> </ns1:map-Value> > >> </ns1:map-Entry> > >> </ns1:map-Map> > >> </ns1:calculateProductPrice> > >> </soap:Body> > >> </soap:Envelope> > >> > >> <!-- end of soap --> > >> > >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > >> |ModelService |E| [ModelService.validate] : > >> {calculateProductPrice} : (IN) Required test error: > >> org.apache.ofbiz.service.ServiceValidationException: Type check failed > for > >> field [calculateProductPrice.product]; expected type is > >> [org.apache.ofbiz.entity.GenericValue]; actual type is > [java.util.HashMap] > >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > >> |ServiceDispatcher |E| Incoming context (in runSync : > >> calculateProductPrice) does not match expected requirements > >> org.apache.ofbiz.service.ServiceValidationException: Type check failed > for > >> field [calculateProductPrice.product]; expected type is > >> [org.apache.ofbiz.entity.GenericValue]; actual type is > [java.util.HashMap] > >> > >> > >> > >> regds > >> mallah. > >> > >> > >> > >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email] > > > >> wrote: > >> > >> > > >> > Hello Taher , > >> > > >> > As suggested i shifted this discussion to the user list from dev. > >> > > >> > As you expected the product key has a value which is a > >> > struct. This maps to java.util.HashMap but the validator > >> > expects it to be a GenericValue and hence it does not hands it over > >> > to the service. > >> > > >> > > >> > $ ./007-get-price.pl PROD_SY87B9B8MY > >> > 2018/03/23 15:34:31 ------------------------------ > >> > -------------------------------------------------- > >> > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" > >> encoding="UTF-8"?> > >> > REQ >>>>>>>>> <methodCall> > >> > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> > >> > REQ >>>>>>>>> <params> > >> > REQ >>>>>>>>> <param> > >> > REQ >>>>>>>>> <value> > >> > REQ >>>>>>>>> <struct> > >> > REQ >>>>>>>>> <member> > >> > REQ >>>>>>>>> <name>login.password</name> > >> > REQ >>>>>>>>> <value> > >> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> > >> > REQ >>>>>>>>> </value> > >> > REQ >>>>>>>>> </member> > >> > REQ >>>>>>>>> <member> > >> > REQ >>>>>>>>> <name>product</name> > >> > REQ >>>>>>>>> <value> > >> > REQ >>>>>>>>> <struct> > >> > REQ >>>>>>>>> <member> > >> > REQ >>>>>>>>> <name>productId</name> > >> > REQ >>>>>>>>> <value> > >> > REQ >>>>>>>>> <string><![CDATA[PROD_ > >> > SY87B9B8MY]]></string> > >> > REQ >>>>>>>>> </value> > >> > REQ >>>>>>>>> </member> > >> > REQ >>>>>>>>> </struct> > >> > REQ >>>>>>>>> </value> > >> > REQ >>>>>>>>> </member> > >> > REQ >>>>>>>>> <member> > >> > REQ >>>>>>>>> <name>login.username</name> > >> > REQ >>>>>>>>> <value> > >> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> > >> > REQ >>>>>>>>> </value> > >> > REQ >>>>>>>>> </member> > >> > REQ >>>>>>>>> </struct> > >> > REQ >>>>>>>>> </value> > >> > REQ >>>>>>>>> </param> > >> > REQ >>>>>>>>> </params> > >> > REQ >>>>>>>>> </methodCall> > >> > 2018/03/23 15:34:31 ------------------------------ > >> > -------------------------------------------------- > >> > 2018/03/23 15:34:31 ------------------------------ > >> > -------------------------------------------------- > >> > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" > >> encoding="UTF-8"?> > >> > RES <<<<<<<<< <methodResponse > >> > RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ > >> > extensions"> > >> > RES <<<<<<<<< <fault> > >> > RES <<<<<<<<< <value> > >> > RES <<<<<<<<< <struct> > >> > RES <<<<<<<<< <member> > >> > RES <<<<<<<<< <name>faultCode</name> > >> > RES <<<<<<<<< <value> > >> > RES <<<<<<<<< <i4>0</i4> > >> > RES <<<<<<<<< </value> > >> > RES <<<<<<<<< </member> > >> > RES <<<<<<<<< <member> > >> > RES <<<<<<<<< <name>faultString</name> > >> > RES <<<<<<<<< <value>Type check failed for field > >> > RES <<<<<<<<< [calculateProductPrice.product]; expected > >> > type is > >> > RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; > >> > actual type is > >> > RES <<<<<<<<< [java.util.HashMap]</value> > >> > RES <<<<<<<<< </member> > >> > RES <<<<<<<<< </struct> > >> > RES <<<<<<<<< </value> > >> > RES <<<<<<<<< </fault> > >> > RES <<<<<<<<< </methodResponse> > >> > 2018/03/23 15:34:31 ------------------------------ > >> > -------------------------------------------------- > >> > Service: calculateProductPrice faultString:Type check failed for field > >> > [calculateProductPrice.product]; expected type is > >> > [org.apache.ofbiz.entity.GenericValue]; actual type is > >> [java.util.HashMap] > >> > > >> > ======================================== > >> > $ cat 007-get-price.pl > >> > > >> > #!/usr/bin/perl > >> > > >> > use OFBizClient; > >> > > >> > my $ofbiz_client = OFBizClient->new( > >> > url => 'https://your_ofbiz_server_ > >> > here/webtools/control/xmlrpc' , > >> > username=>'admin' , > >> > password => 'ofbiz' > >> > ); > >> > > >> > my $productId = 'PROD_SY87B9B8MY'; > >> > $ofbiz_client->call('calculateProductPrice' , { product => { > productId > >> > => $productId } } ); > >> > > >> > ======================================== > >> > > >> > > >> > > >> > |
I think maybe the best thing to do is create a JIRA with a topic like
"Allowing XML-RPC and SOAP to pass GenericValue objects to services as IN fields". We can then collaborate together on making a solution. I'm interested in helping if you like that. Oh, and I'm still interested in your invoke mechanism which I asked earlier? On Sat, Mar 24, 2018 at 12:12 PM, Rajesh Mallah <[hidden email]> wrote: > Hello Rishi / Jacques /Taher , > > Thanks for the responses. > > I feel a generic solution should be devised and I want to put some effort > so that an incoming Map is converted to a GenericValue . > Which is a more appropriate place ModelService or XmlRpcEventHandler > and where can the change be done in a relatively easier fashion ? > > > regds > mallah > > > > On Sat, Mar 24, 2018 at 2:32 PM, Taher Alkhateeb <[hidden email] >> wrote: > >> Thinking out loud, maybe one solution in here is to update the logic >> in ModelService such that a map is automatically casted to a >> GenericValue, or any object that is "instanceOf" would pass through. >> The problem of course is how to carry "state" in these objects, which >> is the reason why I dislike passing objects to services. >> >> So another question, I see both SOAP and XML-RPC messages here, but >> how are you invoking them? Is it just a simple URL or what? >> >> On Sat, Mar 24, 2018 at 11:51 AM, Rishi Solanki <[hidden email]> >> wrote: >> > Hi Rajesh, >> > SOAP request or XMLRPC request both uses the standard format conversion >> > basic/regular java supports. That means if you are sending bunch of key >> > value pair wrt a key ... in your case key is product. Then it will always >> > convert it into the Map. So what general practices followed for xml data >> > exchange is already exists. >> > >> > To have generic value or any other class value in your service IN >> > parameter, you may need to add converter before passing it to service for >> > invoke. That means, your checkMap method must be enabled for this type of >> > conversion. Also this method will be invoked on IN parameter type. Please >> > see XmlRpcEventHandler.getContext() for more details. >> > >> > This should be quick one and should resolve your problem, which enable >> the >> > conversion of target type. A generic approach also welcome for >> > contribution. :-) >> > >> > HTH! >> > >> > Regards, >> > -- >> > >> > Rishi Solanki >> > Sr Manager, Enterprise Software Development >> > HotWax Systems Pvt. Ltd. >> > Direct: +91-9893287847 >> > http://www.hotwaxsystems.com >> > www.hotwax.co >> > >> > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah <[hidden email] >> > >> > wrote: >> > >> >> Hi Jacques / List , >> >> >> >> I face the very same problem with SOAP too , pls have a look if the SOAP >> >> message is OK. Please suggest any edits to the SOAP message which i may >> >> try. >> >> >> >> >> >> <!-- start of soap --> >> >> >> >> <?xml version="1.0" encoding="UTF-8"?> >> >> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ >> >> encoding/" >> >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" >> >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" >> >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" >> >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" >> >> http://www.w3.org/2001/XMLSchema-instance"> >> >> <soap:Body> >> >> <ns1:calculateProductPrice> >> >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" >> >> xsi:type="soapenc:Array"> >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> >> xsi:type="soapenc:Array"> >> >> <ns1:map-Key> >> >> <ns1:std-String value="login.username" /> >> >> </ns1:map-Key> >> >> <ns1:map-Value> >> >> <ns1:std-String value="admin" /> >> >> </ns1:map-Value> >> >> </ns1:map-Entry> >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> >> xsi:type="soapenc:Array"> >> >> <ns1:map-Key> >> >> <ns1:std-String value="login.password" /> >> >> </ns1:map-Key> >> >> <ns1:map-Value> >> >> <ns1:std-String value="ofbiz" /> >> >> </ns1:map-Value> >> >> </ns1:map-Entry> >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" >> >> xsi:type="soapenc:Array"> >> >> <ns1:map-Key> >> >> <ns1:std-String value="product" /> >> >> </ns1:map-Key> >> >> <ns1:map-Value> >> >> <ns1:map-Map> >> >> <ns1:map-Entry >> >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> >> >> <ns1:map-Key> >> >> <ns1:std-String value="productId" /> >> >> </ns1:map-Key> >> >> <ns1:map-Value> >> >> <ns1:std-String >> value="PROD_SY87B9B8MY" >> >> /> >> >> </ns1:map-Value> >> >> </ns1:map-Entry> >> >> </ns1:map-Map> >> >> </ns1:map-Value> >> >> </ns1:map-Entry> >> >> </ns1:map-Map> >> >> </ns1:calculateProductPrice> >> >> </soap:Body> >> >> </soap:Envelope> >> >> >> >> <!-- end of soap --> >> >> >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> >> |ModelService |E| [ModelService.validate] : >> >> {calculateProductPrice} : (IN) Required test error: >> >> org.apache.ofbiz.service.ServiceValidationException: Type check failed >> for >> >> field [calculateProductPrice.product]; expected type is >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is >> [java.util.HashMap] >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 >> >> |ServiceDispatcher |E| Incoming context (in runSync : >> >> calculateProductPrice) does not match expected requirements >> >> org.apache.ofbiz.service.ServiceValidationException: Type check failed >> for >> >> field [calculateProductPrice.product]; expected type is >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is >> [java.util.HashMap] >> >> >> >> >> >> >> >> regds >> >> mallah. >> >> >> >> >> >> >> >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah <[hidden email] >> > >> >> wrote: >> >> >> >> > >> >> > Hello Taher , >> >> > >> >> > As suggested i shifted this discussion to the user list from dev. >> >> > >> >> > As you expected the product key has a value which is a >> >> > struct. This maps to java.util.HashMap but the validator >> >> > expects it to be a GenericValue and hence it does not hands it over >> >> > to the service. >> >> > >> >> > >> >> > $ ./007-get-price.pl PROD_SY87B9B8MY >> >> > 2018/03/23 15:34:31 ------------------------------ >> >> > -------------------------------------------------- >> >> > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" >> >> encoding="UTF-8"?> >> >> > REQ >>>>>>>>> <methodCall> >> >> > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> >> >> > REQ >>>>>>>>> <params> >> >> > REQ >>>>>>>>> <param> >> >> > REQ >>>>>>>>> <value> >> >> > REQ >>>>>>>>> <struct> >> >> > REQ >>>>>>>>> <member> >> >> > REQ >>>>>>>>> <name>login.password</name> >> >> > REQ >>>>>>>>> <value> >> >> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> >> >> > REQ >>>>>>>>> </value> >> >> > REQ >>>>>>>>> </member> >> >> > REQ >>>>>>>>> <member> >> >> > REQ >>>>>>>>> <name>product</name> >> >> > REQ >>>>>>>>> <value> >> >> > REQ >>>>>>>>> <struct> >> >> > REQ >>>>>>>>> <member> >> >> > REQ >>>>>>>>> <name>productId</name> >> >> > REQ >>>>>>>>> <value> >> >> > REQ >>>>>>>>> <string><![CDATA[PROD_ >> >> > SY87B9B8MY]]></string> >> >> > REQ >>>>>>>>> </value> >> >> > REQ >>>>>>>>> </member> >> >> > REQ >>>>>>>>> </struct> >> >> > REQ >>>>>>>>> </value> >> >> > REQ >>>>>>>>> </member> >> >> > REQ >>>>>>>>> <member> >> >> > REQ >>>>>>>>> <name>login.username</name> >> >> > REQ >>>>>>>>> <value> >> >> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> >> >> > REQ >>>>>>>>> </value> >> >> > REQ >>>>>>>>> </member> >> >> > REQ >>>>>>>>> </struct> >> >> > REQ >>>>>>>>> </value> >> >> > REQ >>>>>>>>> </param> >> >> > REQ >>>>>>>>> </params> >> >> > REQ >>>>>>>>> </methodCall> >> >> > 2018/03/23 15:34:31 ------------------------------ >> >> > -------------------------------------------------- >> >> > 2018/03/23 15:34:31 ------------------------------ >> >> > -------------------------------------------------- >> >> > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" >> >> encoding="UTF-8"?> >> >> > RES <<<<<<<<< <methodResponse >> >> > RES <<<<<<<<< xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/ >> >> > extensions"> >> >> > RES <<<<<<<<< <fault> >> >> > RES <<<<<<<<< <value> >> >> > RES <<<<<<<<< <struct> >> >> > RES <<<<<<<<< <member> >> >> > RES <<<<<<<<< <name>faultCode</name> >> >> > RES <<<<<<<<< <value> >> >> > RES <<<<<<<<< <i4>0</i4> >> >> > RES <<<<<<<<< </value> >> >> > RES <<<<<<<<< </member> >> >> > RES <<<<<<<<< <member> >> >> > RES <<<<<<<<< <name>faultString</name> >> >> > RES <<<<<<<<< <value>Type check failed for field >> >> > RES <<<<<<<<< [calculateProductPrice.product]; expected >> >> > type is >> >> > RES <<<<<<<<< [org.apache.ofbiz.entity.GenericValue]; >> >> > actual type is >> >> > RES <<<<<<<<< [java.util.HashMap]</value> >> >> > RES <<<<<<<<< </member> >> >> > RES <<<<<<<<< </struct> >> >> > RES <<<<<<<<< </value> >> >> > RES <<<<<<<<< </fault> >> >> > RES <<<<<<<<< </methodResponse> >> >> > 2018/03/23 15:34:31 ------------------------------ >> >> > -------------------------------------------------- >> >> > Service: calculateProductPrice faultString:Type check failed for field >> >> > [calculateProductPrice.product]; expected type is >> >> > [org.apache.ofbiz.entity.GenericValue]; actual type is >> >> [java.util.HashMap] >> >> > >> >> > ======================================== >> >> > $ cat 007-get-price.pl >> >> > >> >> > #!/usr/bin/perl >> >> > >> >> > use OFBizClient; >> >> > >> >> > my $ofbiz_client = OFBizClient->new( >> >> > url => 'https://your_ofbiz_server_ >> >> > here/webtools/control/xmlrpc' , >> >> > username=>'admin' , >> >> > password => 'ofbiz' >> >> > ); >> >> > >> >> > my $productId = 'PROD_SY87B9B8MY'; >> >> > $ofbiz_client->call('calculateProductPrice' , { product => { >> productId >> >> > => $productId } } ); >> >> > >> >> > ======================================== >> >> > >> >> > >> >> > >> >> >> |
Hi Taher ,
I filed a JIRA https://issues.apache.org/jira/browse/OFBIZ-10317 Oh, and I'm still interested in your invoke mechanism which I asked earlier? Are you referring to your suggestion of refactoring calculateProductPrice? i have lost the context. for me XMLRPC / SOAP were the only/primary methods of communicating with OFBiz , OOTB was just for verification and creation of control datapoints . regds mallah. On Sat, Mar 24, 2018 at 2:51 PM, Taher Alkhateeb <[hidden email] > wrote: > I think maybe the best thing to do is create a JIRA with a topic like > "Allowing XML-RPC and SOAP to pass GenericValue objects to services as > IN fields". We can then collaborate together on making a solution. I'm > interested in helping if you like that. > > Oh, and I'm still interested in your invoke mechanism which I asked > earlier? > > On Sat, Mar 24, 2018 at 12:12 PM, Rajesh Mallah <[hidden email]> > wrote: > > Hello Rishi / Jacques /Taher , > > > > Thanks for the responses. > > > > I feel a generic solution should be devised and I want to put some > effort > > so that an incoming Map is converted to a GenericValue . > > Which is a more appropriate place ModelService or XmlRpcEventHandler > > and where can the change be done in a relatively easier fashion ? > > > > > > regds > > mallah > > > > > > > > On Sat, Mar 24, 2018 at 2:32 PM, Taher Alkhateeb < > [hidden email] > >> wrote: > > > >> Thinking out loud, maybe one solution in here is to update the logic > >> in ModelService such that a map is automatically casted to a > >> GenericValue, or any object that is "instanceOf" would pass through. > >> The problem of course is how to carry "state" in these objects, which > >> is the reason why I dislike passing objects to services. > >> > >> So another question, I see both SOAP and XML-RPC messages here, but > >> how are you invoking them? Is it just a simple URL or what? > >> > >> On Sat, Mar 24, 2018 at 11:51 AM, Rishi Solanki < > [hidden email]> > >> wrote: > >> > Hi Rajesh, > >> > SOAP request or XMLRPC request both uses the standard format > conversion > >> > basic/regular java supports. That means if you are sending bunch of > key > >> > value pair wrt a key ... in your case key is product. Then it will > always > >> > convert it into the Map. So what general practices followed for xml > data > >> > exchange is already exists. > >> > > >> > To have generic value or any other class value in your service IN > >> > parameter, you may need to add converter before passing it to service > for > >> > invoke. That means, your checkMap method must be enabled for this > type of > >> > conversion. Also this method will be invoked on IN parameter type. > Please > >> > see XmlRpcEventHandler.getContext() for more details. > >> > > >> > This should be quick one and should resolve your problem, which enable > >> the > >> > conversion of target type. A generic approach also welcome for > >> > contribution. :-) > >> > > >> > HTH! > >> > > >> > Regards, > >> > -- > >> > > >> > Rishi Solanki > >> > Sr Manager, Enterprise Software Development > >> > HotWax Systems Pvt. Ltd. > >> > Direct: +91-9893287847 > >> > http://www.hotwaxsystems.com > >> > www.hotwax.co > >> > > >> > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah < > [hidden email] > >> > > >> > wrote: > >> > > >> >> Hi Jacques / List , > >> >> > >> >> I face the very same problem with SOAP too , pls have a look if the > SOAP > >> >> message is OK. Please suggest any edits to the SOAP message which i > may > >> >> try. > >> >> > >> >> > >> >> <!-- start of soap --> > >> >> > >> >> <?xml version="1.0" encoding="UTF-8"?> > >> >> <soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/ > >> >> encoding/" > >> >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" > >> >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" > >> >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" > >> >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" > >> >> http://www.w3.org/2001/XMLSchema-instance"> > >> >> <soap:Body> > >> >> <ns1:calculateProductPrice> > >> >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" > >> >> xsi:type="soapenc:Array"> > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> >> xsi:type="soapenc:Array"> > >> >> <ns1:map-Key> > >> >> <ns1:std-String value="login.username" /> > >> >> </ns1:map-Key> > >> >> <ns1:map-Value> > >> >> <ns1:std-String value="admin" /> > >> >> </ns1:map-Value> > >> >> </ns1:map-Entry> > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> >> xsi:type="soapenc:Array"> > >> >> <ns1:map-Key> > >> >> <ns1:std-String value="login.password" /> > >> >> </ns1:map-Key> > >> >> <ns1:map-Value> > >> >> <ns1:std-String value="ofbiz" /> > >> >> </ns1:map-Value> > >> >> </ns1:map-Entry> > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > >> >> xsi:type="soapenc:Array"> > >> >> <ns1:map-Key> > >> >> <ns1:std-String value="product" /> > >> >> </ns1:map-Key> > >> >> <ns1:map-Value> > >> >> <ns1:map-Map> > >> >> <ns1:map-Entry > >> >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> > >> >> <ns1:map-Key> > >> >> <ns1:std-String > value="productId" /> > >> >> </ns1:map-Key> > >> >> <ns1:map-Value> > >> >> <ns1:std-String > >> value="PROD_SY87B9B8MY" > >> >> /> > >> >> </ns1:map-Value> > >> >> </ns1:map-Entry> > >> >> </ns1:map-Map> > >> >> </ns1:map-Value> > >> >> </ns1:map-Entry> > >> >> </ns1:map-Map> > >> >> </ns1:calculateProductPrice> > >> >> </soap:Body> > >> >> </soap:Envelope> > >> >> > >> >> <!-- end of soap --> > >> >> > >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > >> >> |ModelService |E| [ModelService.validate] : > >> >> {calculateProductPrice} : (IN) Required test error: > >> >> org.apache.ofbiz.service.ServiceValidationException: Type check > failed > >> for > >> >> field [calculateProductPrice.product]; expected type is > >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is > >> [java.util.HashMap] > >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > >> >> |ServiceDispatcher |E| Incoming context (in runSync : > >> >> calculateProductPrice) does not match expected requirements > >> >> org.apache.ofbiz.service.ServiceValidationException: Type check > failed > >> for > >> >> field [calculateProductPrice.product]; expected type is > >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is > >> [java.util.HashMap] > >> >> > >> >> > >> >> > >> >> regds > >> >> mallah. > >> >> > >> >> > >> >> > >> >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah < > [hidden email] > >> > > >> >> wrote: > >> >> > >> >> > > >> >> > Hello Taher , > >> >> > > >> >> > As suggested i shifted this discussion to the user list from dev. > >> >> > > >> >> > As you expected the product key has a value which is a > >> >> > struct. This maps to java.util.HashMap but the validator > >> >> > expects it to be a GenericValue and hence it does not hands it over > >> >> > to the service. > >> >> > > >> >> > > >> >> > $ ./007-get-price.pl PROD_SY87B9B8MY > >> >> > 2018/03/23 15:34:31 ------------------------------ > >> >> > -------------------------------------------------- > >> >> > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" > >> >> encoding="UTF-8"?> > >> >> > REQ >>>>>>>>> <methodCall> > >> >> > REQ >>>>>>>>> <methodName>calculateProductPrice</methodName> > >> >> > REQ >>>>>>>>> <params> > >> >> > REQ >>>>>>>>> <param> > >> >> > REQ >>>>>>>>> <value> > >> >> > REQ >>>>>>>>> <struct> > >> >> > REQ >>>>>>>>> <member> > >> >> > REQ >>>>>>>>> <name>login.password</name> > >> >> > REQ >>>>>>>>> <value> > >> >> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> > >> >> > REQ >>>>>>>>> </value> > >> >> > REQ >>>>>>>>> </member> > >> >> > REQ >>>>>>>>> <member> > >> >> > REQ >>>>>>>>> <name>product</name> > >> >> > REQ >>>>>>>>> <value> > >> >> > REQ >>>>>>>>> <struct> > >> >> > REQ >>>>>>>>> <member> > >> >> > REQ >>>>>>>>> <name>productId</name> > >> >> > REQ >>>>>>>>> <value> > >> >> > REQ >>>>>>>>> <string><![CDATA[PROD_ > >> >> > SY87B9B8MY]]></string> > >> >> > REQ >>>>>>>>> </value> > >> >> > REQ >>>>>>>>> </member> > >> >> > REQ >>>>>>>>> </struct> > >> >> > REQ >>>>>>>>> </value> > >> >> > REQ >>>>>>>>> </member> > >> >> > REQ >>>>>>>>> <member> > >> >> > REQ >>>>>>>>> <name>login.username</name> > >> >> > REQ >>>>>>>>> <value> > >> >> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> > >> >> > REQ >>>>>>>>> </value> > >> >> > REQ >>>>>>>>> </member> > >> >> > REQ >>>>>>>>> </struct> > >> >> > REQ >>>>>>>>> </value> > >> >> > REQ >>>>>>>>> </param> > >> >> > REQ >>>>>>>>> </params> > >> >> > REQ >>>>>>>>> </methodCall> > >> >> > 2018/03/23 15:34:31 ------------------------------ > >> >> > -------------------------------------------------- > >> >> > 2018/03/23 15:34:31 ------------------------------ > >> >> > -------------------------------------------------- > >> >> > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" > >> >> encoding="UTF-8"?> > >> >> > RES <<<<<<<<< <methodResponse > >> >> > RES <<<<<<<<< xmlns:ex="http://ws.apache. > org/xmlrpc/namespaces/ > >> >> > extensions"> > >> >> > RES <<<<<<<<< <fault> > >> >> > RES <<<<<<<<< <value> > >> >> > RES <<<<<<<<< <struct> > >> >> > RES <<<<<<<<< <member> > >> >> > RES <<<<<<<<< <name>faultCode</name> > >> >> > RES <<<<<<<<< <value> > >> >> > RES <<<<<<<<< <i4>0</i4> > >> >> > RES <<<<<<<<< </value> > >> >> > RES <<<<<<<<< </member> > >> >> > RES <<<<<<<<< <member> > >> >> > RES <<<<<<<<< <name>faultString</name> > >> >> > RES <<<<<<<<< <value>Type check failed for field > >> >> > RES <<<<<<<<< [calculateProductPrice.product]; > expected > >> >> > type is > >> >> > RES <<<<<<<<< [org.apache.ofbiz.entity. > GenericValue]; > >> >> > actual type is > >> >> > RES <<<<<<<<< [java.util.HashMap]</value> > >> >> > RES <<<<<<<<< </member> > >> >> > RES <<<<<<<<< </struct> > >> >> > RES <<<<<<<<< </value> > >> >> > RES <<<<<<<<< </fault> > >> >> > RES <<<<<<<<< </methodResponse> > >> >> > 2018/03/23 15:34:31 ------------------------------ > >> >> > -------------------------------------------------- > >> >> > Service: calculateProductPrice faultString:Type check failed for > field > >> >> > [calculateProductPrice.product]; expected type is > >> >> > [org.apache.ofbiz.entity.GenericValue]; actual type is > >> >> [java.util.HashMap] > >> >> > > >> >> > ======================================== > >> >> > $ cat 007-get-price.pl > >> >> > > >> >> > #!/usr/bin/perl > >> >> > > >> >> > use OFBizClient; > >> >> > > >> >> > my $ofbiz_client = OFBizClient->new( > >> >> > url => 'https://your_ofbiz_server_ > >> >> > here/webtools/control/xmlrpc' , > >> >> > username=>'admin' , > >> >> > password => 'ofbiz' > >> >> > ); > >> >> > > >> >> > my $productId = 'PROD_SY87B9B8MY'; > >> >> > $ofbiz_client->call('calculateProductPrice' , { product => { > >> productId > >> >> > => $productId } } ); > >> >> > > >> >> > ======================================== > >> >> > > >> >> > > >> >> > > >> >> > >> > |
Taher,
What I was suggesting to have generic solution so that all the classes can be mapped from Map. In our current discussion it is GenericValue ... it may be ShoppingCart in future. So an method should be smart enough to convert the map object to target class. The only requirement is to have the map keys mapped to class attributes. And yes on thinking more, agree with you that right candidate to have this method should be ModelService, so that service it self take care of her object if possible as it is doing right now in other situations except soap calls. Hopefully we would conclude and get right solution in the jira ticket Rajesh just filed. Thanks! Rishi Solanki Sr Manager, Enterprise Software Development HotWax Systems Pvt. Ltd. Direct: +91-9893287847 http://www.hotwaxsystems.com www.hotwax.co On Sat, Mar 24, 2018 at 3:18 PM, Rajesh Mallah <[hidden email]> wrote: > Hi Taher , > > I filed a JIRA https://issues.apache.org/jira/browse/OFBIZ-10317 > > Oh, and I'm still interested in your invoke mechanism which I asked > earlier? > > > Are you referring to your suggestion of refactoring calculateProductPrice? > i have lost the context. > > for me XMLRPC / SOAP were the only/primary methods of communicating with > OFBiz , OOTB was just for verification and creation of control datapoints . > > regds > mallah. > > > On Sat, Mar 24, 2018 at 2:51 PM, Taher Alkhateeb < > [hidden email] > > wrote: > > > I think maybe the best thing to do is create a JIRA with a topic like > > "Allowing XML-RPC and SOAP to pass GenericValue objects to services as > > IN fields". We can then collaborate together on making a solution. I'm > > interested in helping if you like that. > > > > Oh, and I'm still interested in your invoke mechanism which I asked > > earlier? > > > > On Sat, Mar 24, 2018 at 12:12 PM, Rajesh Mallah <[hidden email] > > > > wrote: > > > Hello Rishi / Jacques /Taher , > > > > > > Thanks for the responses. > > > > > > I feel a generic solution should be devised and I want to put some > > effort > > > so that an incoming Map is converted to a GenericValue . > > > Which is a more appropriate place ModelService or XmlRpcEventHandler > > > and where can the change be done in a relatively easier fashion ? > > > > > > > > > regds > > > mallah > > > > > > > > > > > > On Sat, Mar 24, 2018 at 2:32 PM, Taher Alkhateeb < > > [hidden email] > > >> wrote: > > > > > >> Thinking out loud, maybe one solution in here is to update the logic > > >> in ModelService such that a map is automatically casted to a > > >> GenericValue, or any object that is "instanceOf" would pass through. > > >> The problem of course is how to carry "state" in these objects, which > > >> is the reason why I dislike passing objects to services. > > >> > > >> So another question, I see both SOAP and XML-RPC messages here, but > > >> how are you invoking them? Is it just a simple URL or what? > > >> > > >> On Sat, Mar 24, 2018 at 11:51 AM, Rishi Solanki < > > [hidden email]> > > >> wrote: > > >> > Hi Rajesh, > > >> > SOAP request or XMLRPC request both uses the standard format > > conversion > > >> > basic/regular java supports. That means if you are sending bunch of > > key > > >> > value pair wrt a key ... in your case key is product. Then it will > > always > > >> > convert it into the Map. So what general practices followed for xml > > data > > >> > exchange is already exists. > > >> > > > >> > To have generic value or any other class value in your service IN > > >> > parameter, you may need to add converter before passing it to > service > > for > > >> > invoke. That means, your checkMap method must be enabled for this > > type of > > >> > conversion. Also this method will be invoked on IN parameter type. > > Please > > >> > see XmlRpcEventHandler.getContext() for more details. > > >> > > > >> > This should be quick one and should resolve your problem, which > enable > > >> the > > >> > conversion of target type. A generic approach also welcome for > > >> > contribution. :-) > > >> > > > >> > HTH! > > >> > > > >> > Regards, > > >> > -- > > >> > > > >> > Rishi Solanki > > >> > Sr Manager, Enterprise Software Development > > >> > HotWax Systems Pvt. Ltd. > > >> > Direct: +91-9893287847 > > >> > http://www.hotwaxsystems.com > > >> > www.hotwax.co > > >> > > > >> > On Sat, Mar 24, 2018 at 12:17 AM, Rajesh Mallah < > > [hidden email] > > >> > > > >> > wrote: > > >> > > > >> >> Hi Jacques / List , > > >> >> > > >> >> I face the very same problem with SOAP too , pls have a look if the > > SOAP > > >> >> message is OK. Please suggest any edits to the SOAP message which i > > may > > >> >> try. > > >> >> > > >> >> > > >> >> <!-- start of soap --> > > >> >> > > >> >> <?xml version="1.0" encoding="UTF-8"?> > > >> >> <soap:Envelope soap:encodingStyle="http:// > schemas.xmlsoap.org/soap/ > > >> >> encoding/" > > >> >> xmlns:ns1="http://ofbiz.apache.org/service/" xmlns:soap=" > > >> >> http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc=" > > >> >> http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd=" > > >> >> http://www.w3.org/2001/XMLSchema" xmlns:xsi=" > > >> >> http://www.w3.org/2001/XMLSchema-instance"> > > >> >> <soap:Body> > > >> >> <ns1:calculateProductPrice> > > >> >> <ns1:map-Map soapenc:arrayType="soapenc:Array[3]" > > >> >> xsi:type="soapenc:Array"> > > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > > >> >> xsi:type="soapenc:Array"> > > >> >> <ns1:map-Key> > > >> >> <ns1:std-String value="login.username" /> > > >> >> </ns1:map-Key> > > >> >> <ns1:map-Value> > > >> >> <ns1:std-String value="admin" /> > > >> >> </ns1:map-Value> > > >> >> </ns1:map-Entry> > > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > > >> >> xsi:type="soapenc:Array"> > > >> >> <ns1:map-Key> > > >> >> <ns1:std-String value="login.password" /> > > >> >> </ns1:map-Key> > > >> >> <ns1:map-Value> > > >> >> <ns1:std-String value="ofbiz" /> > > >> >> </ns1:map-Value> > > >> >> </ns1:map-Entry> > > >> >> <ns1:map-Entry soapenc:arrayType="xsd:anyType[2]" > > >> >> xsi:type="soapenc:Array"> > > >> >> <ns1:map-Key> > > >> >> <ns1:std-String value="product" /> > > >> >> </ns1:map-Key> > > >> >> <ns1:map-Value> > > >> >> <ns1:map-Map> > > >> >> <ns1:map-Entry > > >> >> soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> > > >> >> <ns1:map-Key> > > >> >> <ns1:std-String > > value="productId" /> > > >> >> </ns1:map-Key> > > >> >> <ns1:map-Value> > > >> >> <ns1:std-String > > >> value="PROD_SY87B9B8MY" > > >> >> /> > > >> >> </ns1:map-Value> > > >> >> </ns1:map-Entry> > > >> >> </ns1:map-Map> > > >> >> </ns1:map-Value> > > >> >> </ns1:map-Entry> > > >> >> </ns1:map-Map> > > >> >> </ns1:calculateProductPrice> > > >> >> </soap:Body> > > >> >> </soap:Envelope> > > >> >> > > >> >> <!-- end of soap --> > > >> >> > > >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > > >> >> |ModelService |E| [ModelService.validate] : > > >> >> {calculateProductPrice} : (IN) Required test error: > > >> >> org.apache.ofbiz.service.ServiceValidationException: Type check > > failed > > >> for > > >> >> field [calculateProductPrice.product]; expected type is > > >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is > > >> [java.util.HashMap] > > >> >> 2018-03-24 00:08:15,421 |http-nio-8443-exec-2 > > >> >> |ServiceDispatcher |E| Incoming context (in runSync : > > >> >> calculateProductPrice) does not match expected requirements > > >> >> org.apache.ofbiz.service.ServiceValidationException: Type check > > failed > > >> for > > >> >> field [calculateProductPrice.product]; expected type is > > >> >> [org.apache.ofbiz.entity.GenericValue]; actual type is > > >> [java.util.HashMap] > > >> >> > > >> >> > > >> >> > > >> >> regds > > >> >> mallah. > > >> >> > > >> >> > > >> >> > > >> >> On Fri, Mar 23, 2018 at 3:43 PM, Rajesh Mallah < > > [hidden email] > > >> > > > >> >> wrote: > > >> >> > > >> >> > > > >> >> > Hello Taher , > > >> >> > > > >> >> > As suggested i shifted this discussion to the user list from dev. > > >> >> > > > >> >> > As you expected the product key has a value which is a > > >> >> > struct. This maps to java.util.HashMap but the validator > > >> >> > expects it to be a GenericValue and hence it does not hands it > over > > >> >> > to the service. > > >> >> > > > >> >> > > > >> >> > $ ./007-get-price.pl PROD_SY87B9B8MY > > >> >> > 2018/03/23 15:34:31 ------------------------------ > > >> >> > -------------------------------------------------- > > >> >> > 2018/03/23 15:34:31 REQ >>>>>>>>> <?xml version="1.0" > > >> >> encoding="UTF-8"?> > > >> >> > REQ >>>>>>>>> <methodCall> > > >> >> > REQ >>>>>>>>> <methodName>calculateProductPrice</ > methodName> > > >> >> > REQ >>>>>>>>> <params> > > >> >> > REQ >>>>>>>>> <param> > > >> >> > REQ >>>>>>>>> <value> > > >> >> > REQ >>>>>>>>> <struct> > > >> >> > REQ >>>>>>>>> <member> > > >> >> > REQ >>>>>>>>> <name>login.password</name> > > >> >> > REQ >>>>>>>>> <value> > > >> >> > REQ >>>>>>>>> <string><![CDATA[ofbiz]]></string> > > >> >> > REQ >>>>>>>>> </value> > > >> >> > REQ >>>>>>>>> </member> > > >> >> > REQ >>>>>>>>> <member> > > >> >> > REQ >>>>>>>>> <name>product</name> > > >> >> > REQ >>>>>>>>> <value> > > >> >> > REQ >>>>>>>>> <struct> > > >> >> > REQ >>>>>>>>> <member> > > >> >> > REQ >>>>>>>>> <name>productId</name> > > >> >> > REQ >>>>>>>>> <value> > > >> >> > REQ >>>>>>>>> <string><![CDATA[PROD_ > > >> >> > SY87B9B8MY]]></string> > > >> >> > REQ >>>>>>>>> </value> > > >> >> > REQ >>>>>>>>> </member> > > >> >> > REQ >>>>>>>>> </struct> > > >> >> > REQ >>>>>>>>> </value> > > >> >> > REQ >>>>>>>>> </member> > > >> >> > REQ >>>>>>>>> <member> > > >> >> > REQ >>>>>>>>> <name>login.username</name> > > >> >> > REQ >>>>>>>>> <value> > > >> >> > REQ >>>>>>>>> <string><![CDATA[admin]]></string> > > >> >> > REQ >>>>>>>>> </value> > > >> >> > REQ >>>>>>>>> </member> > > >> >> > REQ >>>>>>>>> </struct> > > >> >> > REQ >>>>>>>>> </value> > > >> >> > REQ >>>>>>>>> </param> > > >> >> > REQ >>>>>>>>> </params> > > >> >> > REQ >>>>>>>>> </methodCall> > > >> >> > 2018/03/23 15:34:31 ------------------------------ > > >> >> > -------------------------------------------------- > > >> >> > 2018/03/23 15:34:31 ------------------------------ > > >> >> > -------------------------------------------------- > > >> >> > 2018/03/23 15:34:31 RES <<<<<<<<< <?xml version="1.0" > > >> >> encoding="UTF-8"?> > > >> >> > RES <<<<<<<<< <methodResponse > > >> >> > RES <<<<<<<<< xmlns:ex="http://ws.apache. > > org/xmlrpc/namespaces/ > > >> >> > extensions"> > > >> >> > RES <<<<<<<<< <fault> > > >> >> > RES <<<<<<<<< <value> > > >> >> > RES <<<<<<<<< <struct> > > >> >> > RES <<<<<<<<< <member> > > >> >> > RES <<<<<<<<< <name>faultCode</name> > > >> >> > RES <<<<<<<<< <value> > > >> >> > RES <<<<<<<<< <i4>0</i4> > > >> >> > RES <<<<<<<<< </value> > > >> >> > RES <<<<<<<<< </member> > > >> >> > RES <<<<<<<<< <member> > > >> >> > RES <<<<<<<<< <name>faultString</name> > > >> >> > RES <<<<<<<<< <value>Type check failed for field > > >> >> > RES <<<<<<<<< [calculateProductPrice.product]; > > expected > > >> >> > type is > > >> >> > RES <<<<<<<<< [org.apache.ofbiz.entity. > > GenericValue]; > > >> >> > actual type is > > >> >> > RES <<<<<<<<< [java.util.HashMap]</value> > > >> >> > RES <<<<<<<<< </member> > > >> >> > RES <<<<<<<<< </struct> > > >> >> > RES <<<<<<<<< </value> > > >> >> > RES <<<<<<<<< </fault> > > >> >> > RES <<<<<<<<< </methodResponse> > > >> >> > 2018/03/23 15:34:31 ------------------------------ > > >> >> > -------------------------------------------------- > > >> >> > Service: calculateProductPrice faultString:Type check failed for > > field > > >> >> > [calculateProductPrice.product]; expected type is > > >> >> > [org.apache.ofbiz.entity.GenericValue]; actual type is > > >> >> [java.util.HashMap] > > >> >> > > > >> >> > ======================================== > > >> >> > $ cat 007-get-price.pl > > >> >> > > > >> >> > #!/usr/bin/perl > > >> >> > > > >> >> > use OFBizClient; > > >> >> > > > >> >> > my $ofbiz_client = OFBizClient->new( > > >> >> > url => ' > https://your_ofbiz_server_ > > >> >> > here/webtools/control/xmlrpc' , > > >> >> > username=>'admin' , > > >> >> > password => 'ofbiz' > > >> >> > ); > > >> >> > > > >> >> > my $productId = 'PROD_SY87B9B8MY'; > > >> >> > $ofbiz_client->call('calculateProductPrice' , { product => { > > >> productId > > >> >> > => $productId } } ); > > >> >> > > > >> >> > ======================================== > > >> >> > > > >> >> > > > >> >> > > > >> >> > > >> > > > |
Free forum by Nabble | Edit this page |