Returning Arrays from .net web service to Java ME web service results in compile error of stub?

Posted by sphereinabox on Stack Overflow See other posts from Stack Overflow or by sphereinabox
Published on 2009-01-16T18:38:41Z Indexed on 2010/03/21 21:11 UTC
Read the original article Hit count: 424

Filed under:
|
|

So, I'm getting some compile errors on netbeans 6.5 generated web service code for a java ME client to a c# (vs2005) web service. I've trimmed my example significantly, and it still shows the problem, and not being able to return a collection of things is pretty much a deal-breaker.

c# web service (SimpleWebService.asmx)

<%@ WebService Language="C#" Class="SimpleWebService" %>

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://sphereinabox.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SimpleWebService  : System.Web.Services.WebService {

    [WebMethod]
    public CustomType[] GetSomething() {
        return new CustomType[] {new CustomType("hi"), new CustomType("bye")};
    }
    public class CustomType {
    	public string Name;
    	public CustomType(string _name) {
    		Name = _name;
    	}
    	public CustomType() {
    	}
    }
}

WSDL (automatically generated by vs2005):

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://sphereinabox.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://sphereinabox.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://sphereinabox.com/">
      <s:element name="GetSomething">
        <s:complexType />
      </s:element>
      <s:element name="GetSomethingResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="GetSomethingResult" type="tns:ArrayOfCustomType" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfCustomType">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="CustomType" nillable="true" type="tns:CustomType" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="CustomType">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
        </s:sequence>
      </s:complexType>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="GetSomethingSoapIn">
    <wsdl:part name="parameters" element="tns:GetSomething" />
  </wsdl:message>
  <wsdl:message name="GetSomethingSoapOut">
    <wsdl:part name="parameters" element="tns:GetSomethingResponse" />
  </wsdl:message>
  <wsdl:portType name="SimpleWebServiceSoap">
    <wsdl:operation name="GetSomething">
      <wsdl:input message="tns:GetSomethingSoapIn" />
      <wsdl:output message="tns:GetSomethingSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="SimpleWebServiceSoap" type="tns:SimpleWebServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetSomething">
      <soap:operation soapAction="http://sphereinabox.com/GetSomething" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="SimpleWebServiceSoap12" type="tns:SimpleWebServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetSomething">
      <soap12:operation soapAction="http://sphereinabox.com/GetSomething" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="SimpleWebService">
    <wsdl:port name="SimpleWebServiceSoap" binding="tns:SimpleWebServiceSoap">
      <soap:address location="http://localhost/SimpleWebService/SimpleWebService.asmx" />
    </wsdl:port>
    <wsdl:port name="SimpleWebServiceSoap12" binding="tns:SimpleWebServiceSoap12">
      <soap12:address location="http://localhost/SimpleWebService/SimpleWebService.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Generated (netbeans) code that fails to compile, this was created going through the "Add -> New JavaME to Web Services Client" wizard. (SimpleWebService_Stub.java)

    public ArrayOfCustomType GetSomething() throws java.rmi.RemoteException {
        Object inputObject[] = new Object[] {
        };

        Operation op = Operation.newInstance( _qname_operation_GetSomething, _type_GetSomething, _type_GetSomethingResponse );
        _prepOperation( op );
        op.setProperty( Operation.SOAPACTION_URI_PROPERTY, "http://sphereinabox.com/GetSomething" );
        Object resultObj;
        try {
            resultObj = op.invoke( inputObject );
        } catch( JAXRPCException e ) {
            Throwable cause = e.getLinkedCause();
            if( cause instanceof java.rmi.RemoteException ) {
                throw (java.rmi.RemoteException) cause;
            }
            throw e;
        }

//////// Error on next line, symbol ArrayOfCustomType_fromObject not defined
        return ArrayOfCustomType_fromObject((Object[])((Object[]) resultObj)[0]);
    }

it turns out with this contrived example (the "CustomType" in my production problem has more than one field) I also get errors from this fun code in the same generated (SimpleWebService_Stub.java) generated code. The errors are that string isn't defined (it's String in java, and besides I think this should be talking about CustomType anyway).

private static string string_fromObject( Object obj[] ) {
    if(obj == null) return null;
    string result = new string();
    return result;
}

© Stack Overflow or respective owner

Related posts about web-services

Related posts about java-me