Supported Scenario is to return javax.activation.DataHandler[] instead of File[] even 
that has a
problem. http://nagoya.apache.org/jira/browse/AXIS-1138

-- dims

--- William Bug <[EMAIL PROTECTED]> wrote:
> Many thanks for you feedback, Davanum.
> 
> Are you sure this is a bug?  Since your on the Apache webservices team,  
> I'll take your word for it.
> 
> I was expecting I'm just doing something wrong, though if there's a  
> right way to do this, I can't find it documented anywhere.
> 
> Is there really no way to get Java2WSDL to add the  
> "mime:multipartRelated" element inserted in the "wsdl:output" of a  
> "wsdl:operation" within the "wsdl:binding" portion of the WSDL  
> document?
> 
> Cheers,
> Bill
> 
> On Apr 2, 2004, at 8:52 AM, Davanum Srinivas wrote:
> 
> > Please log a bug - http://issues.apache.org/jira/
> >
> > --- William Bug <[EMAIL PROTECTED]> wrote:
> >> Hi All,
> >>
> >> I'm having trouble creating an appropriate WSDL file to create a
> >> service that returns a large set of binary attachments.
> >>
> >> I've been trying to combine what I could pull from the documentation  
> >> on
> >> WSDL2Java with the info in the very useful article:
> >>
> >> Web services programming tips and tricks: SOAP attachments with  
> >> JAX-RPC
> >> http://www-106.ibm.com/developerworks/webservices/library/ws-tip-
> >> soapjax.html
> >>
> >> So far, I've not been successful.
> >>
> >> I've got an original implementation in SAAJ that works, but the code  
> >> is
> >> much more complicated than it would be had I used JAX-RPC attachments
> >> as described in the article listed above.
> >>
> >> I created a very simple Interface that I ran through Java2WSDL to
> >> create my WSDL file.
> >>
> >> The Interface is as follows:
> >>
> >> <snippet>
> >> import java.io.File;
> >> import java.rmi.Remote;
> >> import java.rmi.RemoteException;
> >>
> >> /**
> >>   *
> >>   * @author  billbug
> >>   */
> >> public interface IRepositoryAccess extends Remote  {
> >>          public File[] getImages(Boolean returnZip, String imageSet)
> >> throws RemoteException;
> >> }
> >> </snippet>
> >>
> >> I assumed extrapolating from the article above that I could have a
> >> return type of File[] to return a collection of attached files.
> >>
> >> The WSDL generated from this interface is all exactly as I'd expect it
> >> to be - except in the wsdl:output element created within the
> >> wsdl:operation element for my function call within the wsdl:binding
> >> section of the WSDL.
> >> Unfortunately, all I get is:
> >>
> >> <snippet>
> >>     <wsdl:output name="getImagesResponse">
> >>            <wsdlsoap:body namespace="urn:RepositoryAccessService"  
> >> use="encoded"/>
> >>           </wsdl:output>
> >> </snippet>
> >>
> >> According to the article, it should look something like this:
> >>
> >> <snippet>
> >>           <wsdl:output name="getImagesResponse">
> >>                    <mime:multipartRelated>
> >>                            <mime:part name="part1">
> >>                                    <wsdlsoap:body
> >> encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
> >> namespace="urn:RepositoryAccessService" use="encoded"/>
> >>                            </mime:part>
> >>                            <mime:part name="part2">
> >>                                    <mime:content part="output"
> >> type="application/octetstream"/>
> >>                            </mime:part>
> >>                    </mime:multipartRelated>
> >>           </wsdl:output>
> >> </snippet>
> >>
> >> with:
> >>    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/";
> >> included in the wsdl:definitions element at the top of the WSDL.
> >>
> >> Basically, it's a multipart MIME message, where the first part is the
> >> body of the SOAP response message, the the additional part(s) are the
> >> attached binary files.
> >>
> >> If I add in the mime:multipartRelated as given above into the
> >> wsdl:output element, then try to run WSDL2Java, I get the following
> >> error:
> >>
> >> java org.apache.axis.wsdl.WSDL2Java --output "gen" --deployScope
> >> "Application" --server-side --skeletonDeploy --verbose
> >> RepositoryAcess.wsdl
> >> java.lang.NullPointerException
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.addMIMETypes(SymbolTable. 
> >> ja
> >> va:2084)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.fillInBindingInfo(SymbolT 
> >> ab
> >> le.java:1860)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.populateBindings(SymbolTa 
> >> bl
> >> e.java:1795)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java 
> >> :
> >> 577)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:421)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java 
> >> :
> >> 408)
> >>          at
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java 
> >> :
> >> 393)
> >>          at
> >> org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:245)
> >>          at java.lang.Thread.run(Thread.java:552)
> >>
> >> I peaked into the source for
> >> org.apache.axis.wsdl.symbolTable.SymbolTable.  At line 2084 where it's
> >> hitting a NullPointerException, it is in the function addMIMETypes as
> >> indicated above.  Here's a snippet from that function:
> >>
> >> <snippet>
> >>      /**
> >>       * Add the parts that are really MIME types as MIME types.
> >>       * A side effect is to return the body Type of the given
> >>       * MIMEMultipartRelated object.
> >>       */
> >>      private Use addMIMETypes(BindingEntry bEntry,  
> >> MIMEMultipartRelated
> >> mpr,
> >>              Operation op) throws IOException {
> >>          Use bodyType = Use.ENCODED;
> >>          List parts = mpr.getMIMEParts();
> >>          Iterator i = parts.iterator();
> >>          while (i.hasNext()) {
> >>              MIMEPart part = (MIMEPart) i.next();
> >>              List elems = part.getExtensibilityElements();
> >>              Iterator j = elems.iterator();
> >>              while (j.hasNext()) {
> >>                  Object obj = j.next();
> >>                  if (obj instanceof MIMEContent) {
> >>                      MIMEContent content = (MIMEContent) obj;
> >>                      TypeEntry typeEntry = findPart(op,
> >> content.getPart());
> >> line:2084-->String dims = typeEntry.getDimensions();
> >>                      if(dims.length() <=0 && typeEntry.getRefType() !=
> >> null) {
> >>                          Node node = typeEntry.getRefType().getNode();
> >>                           
> >> if(getInnerCollectionComponentQName(node)!=null)
> >>                              dims += "[]";
> >>                      }
> >>                      String type = content.getType();
> >>                      if(type == null || type.length() == 0)
> >>                          type = "text/plain";
> >>                      bEntry.setMIMEInfo(op.getName(),  
> >> content.getPart(),
> >> type, dims);
> >> </snippet>
> >>
> >> As best I figure from this code, the typeEntry object is null,  
> >> probably
> >> because content.getPart() returns null or an invalid value.
> >>
> >> I'm pretty certain I've got the wsdl:output MIME syntax in the WSDL
> >> very close.  The part I'm pretty certain is wrong is the line:
> >>
> >>    <mime:content part="output" type="application/octetstream"/>
> >>
> >> I think the 'part="output" is the offending piece.  The article I'm
> >> using as my example describes how to create a WSDL for a function that
> >> accepts an attachment as an input parameter, not one that returns an
> >> attachment.  I'm also trying to attach several files, not just a  
> >> single
> >> file.  It seems I ought to have to specify I'm returning an array of
> 
=== message truncated ===


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

Reply via email to