Getting rmi.MarshalException from my client.
duffcase May 22, 2006 6:19 AMHi.
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!"); Display.getDisplay(this).setCurrent(form); TrivialService_Stub stub = new TrivialService_Stub(); TrivialService ts = (TrivialService)stub; stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "http://10.0.102.112:8080/warme?wsdl"); try { ts.purchase("Person","product"); } catch (RemoteException e) { e.printStackTrace(); } } 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[] {"http://10.0.102.112:8080/warme"}; } public void _setProperty(String name, Object value) { int size = _propertyNames.length; for (int i = 0; i < size; ++i) { if (_propertyNames.equals(name)) { _propertyValues = value; return; } } // 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); _prepOperation(op); 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! System.out.println(_type_purchaseResponse.toString()); 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"> <soap:Body> <tns:purchase> <String_1 xmlns="">person</String_1> <String_2 xmlns="">product</String_2> </tns:purchase> </soap:Body> </soap:Envelope>
and the response:
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Header/> <env:Body> <ns1:purchaseResponse xmlns:ns1='http://org.jboss.ws/samples/docstyle/wrapped/types' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> <result>okPersonProduct</result> </ns1:purchaseResponse> </env:Body> </env:Envelope>
hopefully someone can see whats wrong here..