Help needed regarding RPC::XML return value

D

Darcy

I am trying to write an XML-RPC server method in perl using RPC::XML,
and I am having a rather perplexing problem when I attempt to return a
data structure to the caller (a Java app). I am told that the caller
is expecting an array of structs as the result.

I have tried many things, but have ended up with the same problem. as
an example, and as an attempt to simplify things, this is what my
method is returning:

return [({'SELL_LINE_NUMBER' => '1', 'ERROR_CODE' => "0",
'MESSAGE' => "test", 'CURRENT_TOTAL' => "1"})];

This is the error that the Java app is generating when it receives the
response:

ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer


I have even tried this code snippet:

my @status;
my $record;
$record->{SELL_LINE_NUMBER} = $parts1;
$record->{ERROR_CODE} = "0";
$record->{MESSAGE} = "test";
$record->{CURRENT_TOTAL} = "1";
push(@status,$record);
return \@status;

with the same error being generated. I am at my wit's end trying to
figure out what is going on, and get it working. I also am not having
much luck finding other discussions of this problem elsewhere on the
internet.

I appreciate any and all help that you can supply.

Darcy
 
B

Ben Morrow

Quoth Darcy said:
I am trying to write an XML-RPC server method in perl using RPC::XML,
and I am having a rather perplexing problem when I attempt to return a
data structure to the caller (a Java app). I am told that the caller
is expecting an array of structs as the result.

I have tried many things, but have ended up with the same problem. as
an example, and as an attempt to simplify things, this is what my
method is returning:

return [({'SELL_LINE_NUMBER' => '1', 'ERROR_CODE' => "0",
'MESSAGE' => "test", 'CURRENT_TOTAL' => "1"})];

This is the error that the Java app is generating when it receives the
response:

ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer

Just a completely random guess: have you tried using numbers instead of
strings? That is,

return [{
SELL_LINE_NUMBER => 1, # note absence of quotes
ERROR_CODE => 0,
MESSAGE => 'test',
CURRENT_TOTAL => 1,
}];

Ben
 
J

J. Gleixner

Darcy wrote:
[...]
ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer


I have even tried this code snippet:

my @status;
my $record;
$record->{SELL_LINE_NUMBER} = $parts1;
$record->{ERROR_CODE} = "0";
$record->{MESSAGE} = "test";
$record->{CURRENT_TOTAL} = "1";
push(@status,$record);
return \@status;

with the same error being generated. I am at my wit's end trying to
figure out what is going on, and get it working. I also am not having
much luck finding other discussions of this problem elsewhere on the
internet.

I appreciate any and all help that you can supply.

Just a guess..

Why are you quoting 0 and 1?

Given that the exception points to an Integer problem, remove
the quotes so Java will see it as an Integer instead of a string.
 
D

Darcy

Quoth Darcy <[email protected]>:


I am trying to write an XML-RPC server method in perl using RPC::XML,
and I am having a rather perplexing problem when I attempt to return a
data structure to the caller (a Java app). I am told that the caller
is expecting an array of structs as the result.
I have tried many things, but have ended up with the same problem. as
an example, and as an attempt to simplify things, this is what my
method is returning:
return [({'SELL_LINE_NUMBER' => '1', 'ERROR_CODE' => "0",
'MESSAGE' => "test", 'CURRENT_TOTAL' => "1"})];
This is the error that the Java app is generating when it receives the
response:
ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer

Just a completely random guess: have you tried using numbers instead of
strings? That is,

return [{
SELL_LINE_NUMBER => 1, # note absence of quotes
ERROR_CODE => 0,
MESSAGE => 'test',
CURRENT_TOTAL => 1,
}];

Ben

The reason for quoting the numbers, is because, the specs for the
return list all four as "string". I did try as straight numbers, but
got the same error.
 
T

Todd Wade

Just a completely random guess: have you tried using numbers instead of
strings? That is,
return [{
SELL_LINE_NUMBER => 1, # note absence of quotes
ERROR_CODE => 0,
MESSAGE => 'test',
CURRENT_TOTAL => 1,
}];

The reason for quoting the numbers, is because, the specs for the
return list all four as "string". I did try as straight numbers, but
got the same error.

What does the XML that client sending to the server look like? Thats
what you need to be looking at. For example, you said the spec expects
strings for each value. Chances are that "quoting" the numbers isn't
going to suffice RPC::XML's purposes.

You can coerce a value to a specific type by passing RPC::XML data
objects instead of scalars:

return [{
SELL_LINE_NUMBER => RPC::XML::string->new(1),
ERROR_CODE => RPC::XML::string->new(0),
MESSAGE => 'test',
CURRENT_TOTAL => RPC::XML::string->new(1),
}];

This will format the value as a <string> instead of an <int> in the
XML.

Regards,

trwww
 
D

Darcy

Quoth Darcy <[email protected]>:
I am trying to write an XML-RPC server method in perl using RPC::XML,
and I am having a rather perplexing problem when I attempt to return a
data structure to the caller (a Java app). I am told that the caller
is expecting an array of structs as the result.
This is the error that the Java app is generating when it receives the
response:
ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer
Just a completely random guess: have you tried using numbers instead of
strings? That is,
return [{
SELL_LINE_NUMBER => 1, # note absence of quotes
ERROR_CODE => 0,
MESSAGE => 'test',
CURRENT_TOTAL => 1,
}];
The reason for quoting the numbers, is because, the specs for the
return list all four as "string". I did try as straight numbers, but
got the same error.

What does the XML that client sending to the server look like? Thats
what you need to be looking at. For example, you said the spec expects
strings for each value. Chances are that "quoting" the numbers isn't
going to suffice RPC::XML's purposes.

You can coerce a value to a specific type by passing RPC::XML data
objects instead of scalars:

return [{
SELL_LINE_NUMBER => RPC::XML::string->new(1),
ERROR_CODE => RPC::XML::string->new(0),
MESSAGE => 'test',
CURRENT_TOTAL => RPC::XML::string->new(1),
}];

This will format the value as a <string> instead of an <int> in the
XML.

Regards,

trwww

Thanks. I will try that tomorrow. I do not know what the XML that is
being generated, though, since I currently do not have access to
that. I could try and "fudge" the request, so I can see the result,
unless there is a trick in perl where I could save a copy to file as
well as send to the requestor.
 
D

Darcy

Quoth Darcy <[email protected]>:
I am trying to write an XML-RPC server method in perl using RPC::XML,
and I am having a rather perplexing problem when I attempt to return a
data structure to the caller (a Java app). I am told that the caller
is expecting an array of structs as the result.
This is the error that the Java app is generating when it receives the
response:
ERROR 26 Nov 2007 16:56:50
(org.wh.client.frontend.listener.WHAbstractFrontEndActionListener) -
java.lang.ClassCastException: java.lang.Integer
Just a completely random guess: have you tried using numbers instead of
strings? That is,
return [{
SELL_LINE_NUMBER => 1, # note absence of quotes
ERROR_CODE => 0,
MESSAGE => 'test',
CURRENT_TOTAL => 1,
}];
The reason for quoting the numbers, is because, the specs for the
return list all four as "string". I did try as straight numbers, but
got the same error.

What does the XML that client sending to the server look like? Thats
what you need to be looking at. For example, you said the spec expects
strings for each value. Chances are that "quoting" the numbers isn't
going to suffice RPC::XML's purposes.

You can coerce a value to a specific type by passing RPC::XML data
objects instead of scalars:

return [{
SELL_LINE_NUMBER => RPC::XML::string->new(1),
ERROR_CODE => RPC::XML::string->new(0),
MESSAGE => 'test',
CURRENT_TOTAL => RPC::XML::string->new(1),
}];

This will format the value as a <string> instead of an <int> in the
XML.

Regards,

trwww

Thanks. That worked like a charm. I will remember from now on that I
need to force those that are to be strings in this manner, or else
rather cryptic errors could result.

Darcy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top