Service service = new Service();
             Call    call    = (Call)service.createCall();
             call.setTargetEndpointAddress(
                 new URL(_htmlMenuServiceUrl));

             QName qName = new QName(
                 "HtmlMenuService",
                 "fetchMenuData"
             );
             call.setOperationName(qName);

             QName returnQName = new QName(
                 "com.fwdco.wsbeans",
                 "MenuDataBean"
             );

             call.registerTypeMapping(
                 MenuDataBean.class,
                 returnQName,
                 new BeanSerializerFactory(
                     MenuDataBean.class,
                     returnQName
                 ),
                 new BeanDeserializerFactory(
                     MenuDataBean.class,
                     returnQName
                 )
             );

             call.setReturnType(
                 returnQName,
                 MenuDataBean.class
             );

             _menuDataBean =
                 (MenuDataBean)call.invoke(
                                    new Object[]{
                                        _menuTemplate,
                                        _employerId,
                                        _employeeId,
                                        _userType
                                    }
                               );





 You also need to make sure that the client has access to the class files of
 any Java specific types that you want to send over the wire.
 I haven't tried sending arrays of beans yet.  You may want to create one
 bean with  an array property and specifically map that class.


 Hope it helps
 -Ben Souther

 On Sunday 29 December 2002 12:49 pm, you wrote:
 > Hi all,
 >   I've been struggling with this for quite some time now, and it's time
> > to post as I am about to go insane. Note that I posted this problem to
> > the comp.lang.programmer group before receiving my subscription
> > activation for this list. Here goes:
> >
> > I have a class that returns an array of javabeans (ArticleBean). I want
> > to expose this class as a web service using Axis. So far, I've been
> > successful publishing/consuming simple web services, but I've had no
> > success with anything that returns beans...even the provided sample won't
> > work for me.
> >
> > Here's the relevant axis code from the web service client:
> > String endpoint =
> >
> > "http://localhost:8080/ArticleSearchService/services/ArticleSearchImpl";;
> > Service service = new Service();
> >    Call call=null;
> >
> >     call = (Call) service.createCall();
> >     call.setTargetEndpointAddress( new java.net.URL(endpoint) );
> >  QName qn = new QName( "urn:ArticleBean", "ArticleBean" );
> >          call.registerTypeMapping(ArticleBean.class, qn,
> >                       new
> > org.apache.axis.encoding.ser.BeanSerializerFactory(ArticleBean.class,
> > qn), new
> > org.apache.axis.encoding.ser.BeanDeserializerFactory(ArticleBean.class,
> > qn));
> >    call.setOperationName( new QName("ArticleSearchImpl", "searchByDoi")
> > ); call.addParameter("doi", XMLType.XSD_STRING, ParameterMode.IN);
> > call.setReturnType( XMLType.SOAP_ARRAY );
> >    ab = (ArticleBean[]) call.invoke( new Object [] {doi});
> >
> > And here's the deployment descriptor:
> >
> > <deployment xmlns="http://xml.apache.org/axis/wsdd/";
> > xmlns:java="http://xml.apache.org/axis/wsdd/providers/java";>
> >     <service name="ArticleSearchImpl" provider="java:RPC">
> >         <parameter name="className" value="ArticleSearchImpl"/>
> >         <parameter name="allowedMethods" value="*"/>
> >         <beanMapping qName="myNS:ArticleBean"
> > xmlns:myNS="urn:ArticleBean" languageSpecificType="java:ArticleBean"/>
> >     </service>
> > </deployment>
> >
> > If I view the wsdl at
> > http://localhost:8080/ArticleSearchService/services/ArticleSearchImpl?wsd
> >l, I get the following error: (snip) The value of the attribute
> > "xmlns:tns1" is invalid. Prefixed namespace bindings may not be empty
> >
> > If I invoke a the client class (snippet above), I get "no deserializer
> > defined for array type" in the error message.
> >
> > So.....I tried another approach:
> >
> > put my ArticleSearchImpl class into a package (ArticleSearch).
> > use java2wsdl on this class; then, use wsdl2java, putting the
> > auto-generated files into package ArticleSearch.ws.  This worked well.
> > however, it also put a new version of my ArticleBean class into this
> > package as well, and the deploy.wsdd points to this bean.  Then, I use
> > the auto-generated
> > ArticleSearchImplSoapBindingImpl to wrap my original class, something
> > like this:
> >
> > import ArticleSearch.ArticleSearchImpl;
> > public class ArticleSearchImplSoapBindingImpl implements
> > ArticleSearch.ws.ArticleSearchImpl
> > {
> >     ArticleSearchImpl searcher = new ArticleSearchImpl(); //my original
> > class
> >
> >     public ArticleSearch.ws.ArticleBean[] searchByAuthor(java.lang.String
> > author) throws java.rmi.RemoteException {
> >         return searcher.searchByAuthor(author);
> >     }
> > ....
> > }
> >
> > The problem is that my original class returns an array of
> > ArticleSearch.ArticleBean, not an array of ArticleSearch.ws.ArticleBean.
> > Sticking (ArticleSearch.ws.ArticleBean[]) in front of the return value
> > didn't help, either, as I suspected it wouldn't. So now I've progressed
> > somewhat from my original problem, but i'm still stuck. I cannot believe
> > that it's all that difficult to create this sucker, so I know I'm doing
> > stupid things wrong.
> >
> > Since there is no documentation on the axis site for returning an array
> > of beans, I'm appealing to you all for help.
> >
> > Thanks.
> >
> > Marc

Reply via email to