On Monday 02 December 2002 23:12, you wrote:
> Without looking at the code, my guess would be that Apache SOAP
> serializes the return value based on the declared type of the function,
> not the actual type returned.  I will have to look at this later.

I am shure about it. We had similar problems, but not with an interface but a 
class. 

For example if you have class A and B (B extends A), and the method is 
getA(): A. 

If you return a B, the B will be serialized as A !!! Wich means loosing some 
fields !!! There is a small patch I have received from someone on the list. 
In fact the holl problem deals with polimorphism and somehow apache soap is 
not so good at this. 

dovle 

>
> Scott Nichol
>
> ----- Original Message -----
> From: "Chris Kelly" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, December 02, 2002 5:26 PM
> Subject: Re: passing interfaces instead of classes
>
> > 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]>

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

Reply via email to