All,

I have a web service implemented in Java using Axis. In this service, I have
a method that takes some simple params and returns a single attachment.
Following the Axis examples, I have defined the signature of this method as:
        public DataHandler fileReadAttach(AvakiPrincipal principal, String path,
                        long offset, int count)
                throws RemoteException;

Then, I use java2wsdl wrapped/literal to generate a WSDL for this. The
relevant parts of the WSDL are as below:
        <element name="fileReadAttachResponse">
                <complexType>
                        <sequence>
                                <element name="fileReadAttachReturn"
                                        type="apachesoap:DataHandler"/>
                        </sequence>
                </complexType>
        </element>
        ...
        <wsdl:operation name="fileReadAttach">
                <wsdlsoap:operation soapAction=""/>
                <wsdl:input name="fileReadAttachRequest">
                        <wsdlsoap:body use="literal"/>
                </wsdl:input>
                <wsdl:output name="fileReadAttachResponse">
                        <wsdlsoap:body use="literal"/>
                </wsdl:output>
        </wsdl:operation>

Notice how the attachment refers to an apache:DataHandler element. This
works without a problem when I write Java/Axis clients that target this
service. However, .NET won't even swallow the WSDL because it does not
recognise the apachesoap namespace.

My question is: why isn't the generated WSDL something like:
        <wsdl:operation name="fileReadAttach">
                <wsdlsoap:operation soapAction=""/>
                <wsdl:input name="fileReadAttachRequest">
                        <wsdlsoap:body use="literal"/>
                </wsdl:input>
                <wsdl:output name="fileReadAttachResponse">
                        <mime:multipartRelated>
                                <mime:part>
                                        <wsdlsoap:body parts="body" use="literal"/>
                                </mime:part>
                                <mime:part>
                                        <mime:content part="docs" type="text/plain"/>
                                </mime:part>
                </mime:multipartRelated>
                </wsdl:output>
        </wsdl:operation>
Seems to me that's how it should come out. How do I make it so?

For giggles, I changed the WSDL by hand and tried to generate stubs for it.
wsdl2java failed to do so, with a NullPointerException:
[axis-wsdl2java] WSDL2Java
/home/local/anand/System/Jabc/wsdl/MyServiceWithMIMEDocLit.wsdl
[axis-wsdl2java] Running Wsdl2javaAntTask with parameters:
[axis-wsdl2java]        verbose:false
[axis-wsdl2java]        debug:false
[axis-wsdl2java]        quiet:false
[axis-wsdl2java]        server-side:true
[axis-wsdl2java]        skeletonDeploy:false
[axis-wsdl2java]        helperGen:false
[axis-wsdl2java]        factory:null
[axis-wsdl2java]        nsIncludes:[]
[axis-wsdl2java]        nsExcludes:[]
[axis-wsdl2java]        factoryProps:[]
[axis-wsdl2java]        testCase:false
[axis-wsdl2java]        noImports:false
[axis-wsdl2java]        NStoPkg:{urn:MyServiceCommon=com.abc.api.common.doclit, 
urn:MyServiceWithMIMEDocLit=com.abc.ws.stubs}
[axis-wsdl2java]        output:/home/local/anand/System/Jabc/wsdl
[axis-wsdl2java]        protocolHandlerPkgs:
[axis-wsdl2java]        deployScope:
[axis-wsdl2java]        
URL:/home/local/anand/System/Jabc/wsdl/MyServiceWithMIMEDocLit.wsdl
[axis-wsdl2java]        all:false
[axis-wsdl2java]        typeMappingVersion:1.1
[axis-wsdl2java]        timeout:45000
[axis-wsdl2java]        failOnNetworkErrors:false
[axis-wsdl2java]        printStackTraceOnFailure:true
[axis-wsdl2java]        namespaceMappingFile:null
[axis-wsdl2java]        username:null
[axis-wsdl2java]        :passwordnull
[axis-wsdl2java]        :noWrappedfalse
[axis-wsdl2java]        :implementationClassNamenull
[axis-wsdl2java]        :classpathnull
[axis-wsdl2java]        http.proxyHost=null
[axis-wsdl2java]        http.proxyPort=null
[axis-wsdl2java]        http.proxyUser=null
[axis-wsdl2java]        http.proxyPassword=null
[axis-wsdl2java]        socks.proxyHost=null
[axis-wsdl2java]        socks.proxyPort=null
[axis-wsdl2java] java.lang.NullPointerException
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.addMIMETypes(SymbolTable.java:2864)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.fillInBindingInfo(SymbolTable.java:2544)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.populateBindings(SymbolTable.java:2464)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:731)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:531)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:506)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:483)
[axis-wsdl2java]        at 
org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:356)
[axis-wsdl2java]        at java.lang.Thread.run(Thread.java:534)

Any idea why Axis is failing on what looks like a legitimate WSDL? Should I
open a bug? Thanks!

Anand

Reply via email to