0 Replies Latest reply on May 22, 2006 6:19 AM by Boerre Brox

    Getting rmi.MarshalException from my client.

    Boerre Brox Newbie


      I'm trying to make a simple implementation of a webservice using document/literal and J2Me CLDC1.1 MIDP2.0

      I've been using a combination of jbossws and suns wireless toolkit, but the errors are the same.

      I used wstools to generate all the essential stuff.

      The problem is I'm getting this exceptionn when running it on a device emulator included with the wtk:

      java.rmi.MarshalException: (1)Missing end tag for Body or Envelope
       at com.stubs.TrivialService_Stub.purchase(+75)
       at com.apps.TestClient.startApp(+47)
       at javax.microedition.midlet.MIDletProxy.startApp(+7)
       at com.sun.midp.midlet.Scheduler.schedule(+270)
       at com.sun.midp.main.Main.runLocalClass(+28)
       at com.sun.midp.main.Main.main(+116)

      I've verified the web service with a j2se client, runs smoothly without any hickups.

      This is my simple MIDlet client:

      package com.apps;
      import java.rmi.RemoteException;
      import javax.microedition.lcdui.Display;
      import javax.microedition.lcdui.Form;
      import javax.microedition.midlet.MIDlet;
      import javax.microedition.midlet.MIDletStateChangeException;
      import javax.xml.rpc.Stub;
      import com.stubs.TrivialService;
      import com.stubs.TrivialService_Stub;
      public class TestClient extends MIDlet {
       protected void startApp() throws MIDletStateChangeException {
       Form form = new Form("First test");
       form.append("HEllo Oinkers!");
       TrivialService_Stub stub = new TrivialService_Stub();
       TrivialService ts = (TrivialService)stub;
       stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "");
       try {
       } catch (RemoteException e) {
       protected void pauseApp() {
       // TODO Auto-generated method stub
       protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

      and this is the stubs:
      // This class was generated by 172 StubGenerator.
      // Contents subject to change without notice.
      // @generated
      package com.stubs;
      import javax.xml.rpc.JAXRPCException;
      import javax.xml.namespace.QName;
      import javax.microedition.xml.rpc.Operation;
      import javax.microedition.xml.rpc.Type;
      import javax.microedition.xml.rpc.ComplexType;
      import javax.microedition.xml.rpc.Element;
      public class TrivialService_Stub implements com.stubs.TrivialService, javax.xml.rpc.Stub {
       private String[] _propertyNames;
       private Object[] _propertyValues;
       public TrivialService_Stub() {
       _propertyNames = new String[] {ENDPOINT_ADDRESS_PROPERTY};
       _propertyValues = new Object[] {""};
       public void _setProperty(String name, Object value) {
       int size = _propertyNames.length;
       for (int i = 0; i < size; ++i) {
       if (_propertyNames.equals(name)) {
       _propertyValues = value;
       // Need to expand our array for a new property
       String[] newPropNames = new String[size + 1];
       System.arraycopy(_propertyNames, 0, newPropNames, 0, size);
       _propertyNames = newPropNames;
       Object[] newPropValues = new Object[size + 1];
       System.arraycopy(_propertyValues, 0, newPropValues, 0, size);
       _propertyValues = newPropValues;
       _propertyNames[size] = name;
       _propertyValues[size] = value;
       public Object _getProperty(String name) {
       for (int i = 0; i < _propertyNames.length; ++i) {
       if (_propertyNames.equals(name)) {
       return _propertyValues;
       if (ENDPOINT_ADDRESS_PROPERTY.equals(name) || USERNAME_PROPERTY.equals(name) || PASSWORD_PROPERTY.equals(name)) {
       return null;
       if (SESSION_MAINTAIN_PROPERTY.equals(name)) {
       return new java.lang.Boolean(false);
       throw new JAXRPCException("Stub does not recognize property: "+name);
       protected void _prepOperation(Operation op) {
       for (int i = 0; i < _propertyNames.length; ++i) {
       op.setProperty(_propertyNames, _propertyValues.toString());
       // Begin user methods
       public java.lang.String purchase(java.lang.String string_1, java.lang.String string_2) throws java.rmi.RemoteException {
       // Copy the incoming values into an Object array if needed.
       Object[] inputObject = new Object[2];
       inputObject[0] = string_1;
       inputObject[1] = string_2;
       Operation op = Operation.newInstance(_qname_wrapped_purchase, _type_purchase, _type_purchaseResponse);
       op.setProperty(Operation.SOAPACTION_URI_PROPERTY, "");
       Object resultObj;
       try {
       resultObj = op.invoke(inputObject);
       } catch (JAXRPCException e) {
       Throwable cause = e.getLinkedCause();
       if (cause instanceof java.rmi.RemoteException) {
       System.out.println("this is where it's at!"); // this is the feil!
       throw (java.rmi.RemoteException) cause;
       throw e;
       java.lang.String result;
       // Convert the result into the right Java type.
       // Unwrapped return value
       Object resultObj2 = ((Object[])resultObj)[0];
       result = (java.lang.String)resultObj2;
       return result;
       // End user methods
       protected static final QName _qname_String_1 = new QName("", "String_1");
       protected static final QName _qname_String_2 = new QName("", "String_2");
       protected static final QName _qname_result = new QName("", "result");
       protected static final QName _qname_wrapped_purchase = new QName("http://org.jboss.ws/samples/docstyle/wrapped", "purchase");
       protected static final QName _qname_purchase = new QName("http://org.jboss.ws/samples/docstyle/wrapped/types", "purchase");
       protected static final QName _qname_purchaseResponse = new QName("http://org.jboss.ws/samples/docstyle/wrapped/types", "purchaseResponse");
       protected static final Element _type_purchase;
       protected static final Element _type_purchaseResponse;
       static {
       // Create all of the Type's that this stub uses, once.
       Element _type_String_1;
       _type_String_1 = new Element(_qname_String_1, Type.STRING, 1, 1, true);
       Element _type_String_2;
       _type_String_2 = new Element(_qname_String_2, Type.STRING, 1, 1, true);
       ComplexType _complexType_purchase;
       _complexType_purchase = new ComplexType();
       _complexType_purchase.elements = new Element[2];
       _complexType_purchase.elements[0] = _type_String_1;
       _complexType_purchase.elements[1] = _type_String_2;
       _type_purchase = new Element(_qname_purchase, _complexType_purchase);
       Element _type_result;
       _type_result = new Element(_qname_result, Type.STRING, 1, 1, true);
       ComplexType _complexType_purchaseResponse;
       _complexType_purchaseResponse = new ComplexType();
       _complexType_purchaseResponse.elements = new Element[1];
       _complexType_purchaseResponse.elements[0] = _type_result;
       _type_purchaseResponse = new Element(_qname_purchaseResponse, _complexType_purchaseResponse);

      I've also used a network monitor to intercept the data beeing sent over the wire:

      the request:
      <?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://org.jboss.ws/samples/docstyle/wrapped/types">
       <String_1 xmlns="">person</String_1>
       <String_2 xmlns="">product</String_2>

      and the response:
      <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
       <ns1:purchaseResponse xmlns:ns1='http://org.jboss.ws/samples/docstyle/wrapped/types' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>

      hopefully someone can see whats wrong here..