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]>