There's something weird going on with type mappings, best I can figure.

In this part of the Call class, it's getting the javaType as null, when it should be (I think) the WeatherInfo type created by WSDL2Java:


            javaType = parameters.returnParam.getType().getName();
            }
            if (javaType == null) {
                javaType = "";
            }
            else {
                javaType = javaType + ".class";
            }
            this.setReturnType(returnType);
            try {
                Class clazz = ClassUtils.forName(javaType);
                this.setReturnClass(clazz);
            } catch (ClassNotFoundException swallowedException) {
                //log that this lookup failed,
                log.debug(Messages.getMessage("clientNoReturnClass",
                        javaType));
            }

later it does this:

        Use use = bEntry.getInputBodyType(bop.getOperation());
        setOperationUse(use);
        if (use == Use.LITERAL) {
            // Turn off encoding
            setEncodingStyle(null);
            // turn off XSI types
            setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
        }

user comes back as "literal" which makes the encoding style be set to null... therefore it can't be used later to look up the type mappings.

I guess I don't understand type mappings in Axis. Here's what the unit test generated by WSDL2Java does:

org.apache.axis.description.OperationDesc oper;
        oper = new org.apache.axis.description.OperationDesc();
        oper.setName("GetWeatherInfo");
        oper.addParameter(new javax.xml.namespace.QName("http://ejse.com/WeatherService/", "zipCode"), new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"), int.class, org.apache.axis.description.ParameterDesc.IN, false, false);
        oper.setReturnType(new javax.xml.namespace.QName("http://ejse.com/WeatherService/", "WeatherInfo"));
        oper.setReturnClass(com.eplus.app.service.bind.weather.WeatherInfo.class);
        oper.setReturnQName(new javax.xml.namespace.QName("http://ejse.com/WeatherService/", "GetWeatherInfoResult"));
        oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
        oper.setUse(org.apache.axis.constants.Use.LITERAL);
        _operations[0] = oper;

then later it sets this OperatatonDesc into a new Call object to call the operation. I'm not sure how it fits in, but it also does this:

            qName = new javax.xml.namespace.QName("http://ejse.com/WeatherService/", "WeatherInfo");
            cachedSerQNames.add(qName);
            cls = com.eplus.app.service.bind.weather.WeatherInfo.class;
            cachedSerClasses.add(cls);
            cachedSerFactories.add(beansf);
            cachedDeserFactories.add(beandf);

For my Spring-enabled client (autogenerating a stub and wrapping RemoteExceptions) I do this type mapping:

        TypeMappingRegistry tmr = service.getTypeMappingRegistry();
        TypeMapping tm = tmr.createTypeMapping();

        registerMapping(tm, "WeatherInfo", WeatherInfo.class);
        registerMapping(tm, "ExtendedWeatherInfo", ExtendedWeatherInfo.class);
        registerMapping(tm, "DayForecastInfo", DayForecastInfo.class);
        registerMapping(tm, "NineDayForecastInfo", NineDayForecastInfo.class);
        registerMapping(tm, "ForecastDays", ForecastDays.class);
        registerMapping(tm, "IraqCities", IraqCities.class);
        tmr.register(org.apache.axis.Constants.URI_SOAP11_ENC, tm);
    }

    private void registerMapping(TypeMapping tm, String name, Class clazz) {
        QName qname = new QName("http://ejse.com/WeatherService/",name);

        tm.register(clazz,qname,
                new BeanSerializerFactory(clazz, qname),
                new BeanDeserializerFactory(clazz, qname));
    }

Does anything stand out here? I know the type mappings are getting in there correctly, because I've seen them as I step through with the debugger, but the encodingStyle is being emptied out because it's decided it's used as "literal", so it doesn't find my type mappings.

Thanks,

Jason

On 4/28/05, Davanum Srinivas <[EMAIL PROTECTED]> wrote:
Jason,

are u using the WSDL2Java generated classes? i just tried it and it works fine.

-- dims

On 4/28/05, Jason Carreira <[EMAIL PROTECTED]> wrote:
> Ok, I've created an issue:
> http://issues.apache.org/jira/browse/AXIS-1964
>
>  Now I'm on to another bug :-)
>
>  For some reason when it's trying to find the type mappings it's not getting
> the correct encoding. In the
> org.apache.axis.MessageContext#encodingStyle it's got "".
> My type mappings are correctly mapped for
> org.apache.axis.Constants#URI_SOAP11_ENC
> (" http://schemas.xmlsoap.org/soap/encoding/"), so they're
> not found and I end up with:
>
>  org.xml.sax.SAXException: Deserializing parameter 'GetWeatherInfoResult':
> could not find deserializer for type
> {http://ejse.com/WeatherService/}WeatherInfo
>      at
> org.apache.axis.message.RPCHandler.onStartChild (RPCHandler.java:270)
>      at
> org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
>
>  Any thoughts on where I should look or what I might be doing wrong?
>
>  Jason
>
> On 4/27/05, Davanum Srinivas <[EMAIL PROTECTED]> wrote:
> > Jason,
> >
> > throw JavaUtils.xmlNameToJava into the mix and see if it works with
> > all your test cases...if it does, open up a JIRA bug and i will check
> > it in.
> >
> > thanks,
> > dims
> >
> > On 4/27/05, Jason Carreira < [EMAIL PROTECTED]> wrote:
> > > Hi all,
> > >
> > >  I'm moving from Apache Axis 1.1 to 1.2RC3 and I'm having an issue with
> > > calling methods on a web service I've generated a client for. I
> re-generated
> > > the client code for 1.2RC3. I'm switching because we're moving from
> JDK1.4.2
> > > up to JDK5 and the "enum" variable names and package are illegal.
> > >
> > >  Anyway, on to my problem. The service I'm binding to is the weather
> service
> > > here:
> > >
> http://www.ejse.com/services/weather_xml_web_services.htm.
> > > It's just an example app to show how we can do these things and to test
> out
> > > using Spring's Axis support. With 1.1 this worked fine. With 1.2RC3 I've
> > > tracked the problem down to the section starting with line 1338 in
> > > org.apache.axis.client.Call:
> > >
> > >          for ( int i = 0 ; i < operations.size() ; i++, op=null ) {
> > >              op = (Operation) operations.get( i );
> > >              if ( opName.equals( op.getName() ) ) {
> > >                  break ;
> > >              }
> > >          }
> > >
> > >  The problem is that opName is the name of the method from the generated
> > > stub interface: "getWeatherInfo". The op.getName is returning
> > > "GetWeatherInfo". I looked at the code for Call in Axis 1.1, and it
> looks
> > > the same, so I'm not sure why it was working, but it was. Unfortunately,
> no
> > > such luck in Axis 1.2RC3.
> > >
> > >  Any ideas? Is there something I'm doing wrong, or is this a bug?
> > >
> > >  Thanks,
> > >
> > >  Jason
> >
> > --
> > Davanum Srinivas - http://webservices.apache.org/~dims/
> >
>
>

--
Davanum Srinivas - http://webservices.apache.org/~dims/

Reply via email to