The problem I had is that my service actually looks like this:

 class SoapService {
   public IData doSomething( IData data ) {...}
 }

When I tried to send a ComplexData or SimpleData concrete class back, it
didn't work. Are you saying that was just a config or similar problem?
Currently, I use a return type mapping when one of the service methods
returns an array. Do I need to set up a return type mapping, as shown in
the following code, or will the return be handled automatically and I just
had something set wrong?

SOAPMappingRegistry smr;
...
smr.mapTypes(
  Constants.NS_URI_SOAP_ENC,
  new QName( uri, "return" ),
  null,
  ???, ??? );
...
call.setSOAPMappingRegistry( smr );



At 09:09 AM 12/2/02 -0500, Scott Nichol wrote:
>It is up to you when you define your mappings and/or write your
>serializers whether the classes implementing interfaces will be
>serialized with just information for the interface or for the actual
>class.  I personally prefer to have separate mappings for each concrete
>class.  I don't like to have one serializer for an interface that
>internally actually knows how to serialize each class that implements
>the interface.  Big switch statements or multiple if/else branches don't
>feel right to me in the O-O world.
>
>Anyway, in your case this means I would write serializers (and
>deserializers) for SimpleData and ComplexData, then map each type to the
>corresponding [de-]serializer.  The server will correctly resolve these
>types as parameters to the doSomething method.
>
>----- Original Message -----
>From: "Chris Kelly" <[EMAIL PROTECTED]>
>To: <[EMAIL PROTECTED]>
>Sent: Sunday, December 01, 2002 7:48 PM
>Subject: passing interfaces instead of classes
>
>
>> Consider:
>>
>> interface IData {
>>   int getValue();
>> }
>>
>> class SimpleData implements IData {
>>   int value;
>>   public SimpleData( int v ) { value = v; }
>>   public int getValue() { return value; }
>> }
>>
>> class ComplexData implements IData {
>>   float value, multiplier;
>>   public SimpleData( float v, float m; ) {
>>     value = v;
>>     multiplier = m;
>>   }
>>   public int getValue() {
>>     return (int) ( multiplier * value );
>>   }
>> }
>>
>> Then, consider a service that accepts an IData object:
>>
>> class SoapService {
>>   public doSomething( IData data ) {...}
>> }
>>
>> If I pass an IData object in a bean-like fashion, only the 'value'
>will be
>> sent in the XML, not the 'multiplier' if the IData object I'm sending
>is a
>> ComplexData object.
>>
>> If I change SoapService.doSomething to accept either a SimpleData or a
>> ComplexData, then the other class can't be sent.
>>
>> So, am I missing something, or is it difficult to represent passed
>objects
>> as interfaces? Must they be represented as classes?
>>
>> One way around this would be to pass IData objects as the name in the
>XML,
>> and include the name of the implementing class in the XML as well. An
>IData
>> de/serializer would then determine the implementing class, and call a
>> de/serializer specific to that implementing class. Is there an
>automatic
>> way to do this?
>>
>>
>> --
>> To unsubscribe, e-mail:
><mailto:[EMAIL PROTECTED]>
>> For additional commands, e-mail:
><mailto:[EMAIL PROTECTED]>
>>
>>
>
>
>--
>To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
>
>

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to