users@glassfish.java.net

Re: glassfish doesn't understand KSoap2-msgs

From: Stefan Schilling <mail.suse_at_gmx.de>
Date: Fri, 22 Feb 2008 20:50:29 +0100

Guten Tag Stefan Schilling,

Hello!

Alright, I solved it.

The problem was, that Glassfish doesn't look for the names of the
parameters, but rather for the argument order. In other words, let's
assume my WebService-Method looks like the following:

public void sayHello( String firstName, int age );

Then the arguments added to the SoapBody shall not be added as the
following:

client.addProperty("firstName", String firstName = "Stefan");
client.addProperty("age", int age = 2);

but

client.addProperty("arg0", String firstName = "Stefan");
client.addProperty("arg1", int age = 2);

Now, the error is gone.

Thank you anyway.

Bye,
Stefan

am Mittwoch, 20. Februar 2008 um 16:43 schrieben Sie:

> Hello again!

> Using:
> glassfish-v2ur1-b09d
> kloap2-2.1.2
> JavaME CLDC 1.1, WTK-2.5.2

> I just tried to solve my problem described in
> http://sourceforge.net/forum/forum.php?thread_id=1945385&forum_id=532039
> by writing a simple HelloWorld application. I can send the data and
> the server actually starts the requested Stateless/WebService-Bean.
> But it then crashes, because the parameter could not be read /
> created from the KSoap2-created XML-document.

> I don't know, whats going wrong here, so I just give you some
> details (we call it: 'code' :) ). WSDL, Server, Client, in that order.

> Please write, if you need any other information.

> Thanks!

> Stefan

> ####################### wsdl #######################

> <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI
> at http://jax-ws.dev.java.net. RI's version is JAX-WS RI
> 2.1.2_01-hudson-189-. --><!-- Generated by JAX-WS RI at
> http://jax-ws.dev.java.net. RI's version is JAX-WS RI
> 2.1.2_01-hudson-189-. --><definitions
> xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
> xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
> xmlns:tns="http://middleware.test/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns="http://schemas.xmlsoap.org/wsdl/"
> targetNamespace="http://middleware.test/" name="HelloWorld">
> <wsp:UsingPolicy></wsp:UsingPolicy>
> <wsp:Policy wsu:Id="HelloWorldPortBinding_sayHello_WSAT_Policy">
> <wsp:ExactlyOne>
> <wsp:All>
> <ns1:ATAlwaysCapability
> xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/10/wsat"
> wsp:Optional="false"></ns1:ATAlwaysCapability>
> <ns2:ATAssertion
> xmlns:ns3="http://schemas.xmlsoap.org/ws/2002/12/policy"
> xmlns:ns2="http://schemas.xmlsoap.org/ws/2004/10/wsat"
> ns3:Optional="true" wsp:Optional="true"></ns2:ATAssertion>
> </wsp:All>
> </wsp:ExactlyOne>
> </wsp:Policy>
> <types>
> <xsd:schema>
> <xsd:import namespace="http://middleware.test/"
> schemaLocation="http://172.16.1.1:8080/HelloWorld/HelloWorld?xsd=1"></xsd:import>
> </xsd:schema>
> </types>
> <message name="sayHello">
> <part name="parameters" element="tns:sayHello"></part>
> </message>
> <message name="sayHelloResponse">
> <part name="parameters" element="tns:sayHelloResponse"></part>
> </message>
> <portType name="HelloWorld">
> <operation name="sayHello">
> <input message="tns:sayHello"></input>
> <output message="tns:sayHelloResponse"></output>
> </operation>
> </portType>
> <binding name="HelloWorldPortBinding" type="tns:HelloWorld">
> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
> <operation name="sayHello">
> <wsp:PolicyReference
> URI="#HelloWorldPortBinding_sayHello_WSAT_Policy"></wsp:PolicyReference>
> <soap:operation soapAction=""></soap:operation>
> <input>
> <soap:body use="literal"></soap:body>
> </input>
> <output>
> <soap:body use="literal"></soap:body>
> </output>
> </operation>
> </binding>
> <service name="HelloWorld">
> <port name="HelloWorldPort" binding="tns:HelloWorldPortBinding">
> <soap:address
> location="http://172.16.1.1:8080/HelloWorld/HelloWorld"></soap:address>
> </port>
> </service>
> </definitions>

> ####################### /wsdl #######################

> ####################### server-Beanclass #######################

> package test.middleware;

> import java.util.logging.Logger;
> import javax.ejb.Stateless;
> import javax.jws.WebService;

> @WebService(serviceName="HelloWorld", portName="HelloWorldPort")
> @Stateless
> public class HelloWorld implements HelloClientIF {

> private Logger logger =
> Logger.getLogger(this.getClass().getName());

> public Hello sayHello( Hello partner ){
> logger.info("Starting sayHello");
> String helloString = "Hello
> ".concat(partner.getFirstName()).concat(" ").concat(partner.getName())
>
> .concat(". How are you doing?")
> Hello returnMe = new Hello();
> returnMe.setReturnedString(helloString);
> return returnMe;
> }
> }

> ####################### /server-Beanclass #######################

> ####################### server-Hello.class #######################

> package test.middleware;

> import java.io.Serializable;

> public class Hello implements Serializable {

> private static final long serialVersionUID = 4054913498292705816L;
> private String firstName;
> private String name;
> private String returnedString;
>
>
> public String setReturnedString() {
> return returnedString;
> }
> public void setReturnedString(String returnString) {
> this.returnedString = returnString;
> }
> public String getFirstName() {
> return firstName;
> }
> public void setFirstName(String firstName) {
> this.firstName = firstName;
> }
> public String getName() {
> return name;
> }
> public void setName(String name) {
> this.name = name;
> }
> }

> ####################### /server-Hello.class #######################

> ...of course, I cannot use the java.io.Serializable class in CLDC.
> So, the client has its own HelloClient.class:

> ####################### client-HelloClient.class #######################

> package testClient;

> import java.util.Hashtable;

> import org.ksoap2.serialization.KvmSerializable;
> import org.ksoap2.serialization.PropertyInfo;
> import org.ksoap2.serialization.SoapSerializationEnvelope;

> public class HelloClient implements KvmSerializable {

> private String firstName;
> private String name;
> private String returnedString = "autsch";
>
>
> public String getFirstName() {
> return firstName;
> }

> public void setFirstName(String foreName) {
> this.firstName = foreName;
> }

> public String getName() {
> return name;
> }

> public void setName(String name) {
> this.name = name;
> }

> public String getReturnedString() {
> return returnedString;
> }

> public void setReturnedString(String returnedString) {
> this.returnedString = returnedString;
> }

> public Object getProperty(int index) {

> if ( index == 0 ) {
> return getFirstName();
> } else if ( index == 1 ) {
> return getName();
> } else if ( index == 2 ) {
> return getReturnedString();
> } else {
> return null;
> }
> }

> public int getPropertyCount() {
>
> return 3;
> }

> public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) {
>
> info.type = PropertyInfo.STRING_CLASS;
> if(index == 0) {
> info.name = "firstName";
> } else if (index == 1) {
> info.name = "name";
> } else if (index == 2) {
> info.name = "returnedString";
> } else {
> }
>
> }

> public void setProperty(int index, Object obj) {
> if ( index == 0 ) {
> setFirstName( (String) obj );
> } else if ( index == 1 ) {
> setName( (String) obj );
> } else if ( index == 2 ) {
> setReturnedString((String) obj );
> } else {
>
> }
> }

> public void register(SoapSerializationEnvelope envelope) {
> envelope.addMapping("http://172.16.1.1/middleware", "HelloClient", this.getClass());
>
> }
> }

> ####################### /client-HelloClient.class #######################

> and here comes the Client Midlet class:

> ####################### client-Run.class #######################

> package testClient;

> import javax.microedition.midlet.MIDlet;
> import javax.microedition.midlet.MIDletStateChangeException;

> import net.sf.microlog.Logger;
> import net.sf.microlog.util.Properties;

> import org.ksoap2.SoapEnvelope;
> import org.ksoap2.serialization.PropertyInfo;
> import org.ksoap2.serialization.SoapObject;
> import org.ksoap2.serialization.SoapSerializationEnvelope;
> import org.ksoap2.transport.HttpTransport;

> public class Run extends MIDlet {
>
> private Properties loggerProps = new Properties(this);
> private Logger logger = Logger.getLogger();
>
> public Run() {
> }

> protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
> }

> protected void pauseApp() {
> }

> protected void startApp() throws MIDletStateChangeException {
>
> logger.configure(loggerProps);
>
> try {
> HelloClient helloClient = new HelloClient();
> helloClient.setFirstName("Stefan");
> helloClient.setName("Schilling");
>
> Class outgoing = helloClient.getClass();
> PropertyInfo pi = new PropertyInfo();
> pi.name = "hello";
> pi.type = outgoing;
> SoapObject template = new
> SoapObject("urn:xmethods:hello", "persDataResponse");
>
> SoapObject client = new
> SoapObject("http://middleware.test/", "sayHello");
>
> client.addProperty("hello", helloClient);
> SoapSerializationEnvelope envelope = new
> SoapSerializationEnvelope(SoapEnvelope.VER11);
> envelope.setOutputSoapObject(client);
> helloClient.register(envelope);
> HttpTransport ht = new
> HttpTransport("http://172.16.1.1:8080/HelloWorld/HelloWorld");
> ht.call("", envelope);
>
>
> template.addProperty(pi, "irrelevant");
> envelope.addTemplate(template);
> envelope.bodyOut = helloClient;
> } catch ( Exception e ){
> logger.error("Caught Exception: \n" + e);
> }
> }
> }


> ####################### /client-Run.class #######################


> As a result, the following document is sent to glassfish app server:

> ####################### sent XML-Document #######################


T 172.16.1.6:2978 ->> 172.16.1.1:8080 [AP]
> POST /HelloWorld/HelloWorld
> HTTP/1.1..
> SOAPAction: ..
> Content-Type: text/xml.
> .Content-Length: 559..
> User-Agent: kSOAP/2.0..
> Host: 172.16.1.1:8080....

> <v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:d="http://www.w3.org/2001/XMLSchema"
> xmlns:c="http://schemas.xmlsoap.org/soap/encoding/"
> xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
> <v:Header />
> <v:Body>
> <n0:sayHello id="o0" c:root="1"
> xmlns:n0="http://middleware.test/">
> <hello i:type="n1:HelloClient"
> xmlns:n1="http://172.16.1.1/middleware">
> <firstName i:type="d:string">Stefan</firstName>
> <name i:type="d:string">Schilling</name>
> <returnedString
> i:type="d:string">autsch</returnedString>
> </hello>
> </n0:sayHello>
> </v:Body>
> </v:Envelope>..

> ####################### /sent XML-Document #######################

> But the server responds with the following Exception:

> ####################### Glassfish-Exception #######################

> [#|2008-02-20T16:01:32.134+0100|INFO|sun-appserver9.1|test.middleware.HelloWorld|_ThreadID=24;_ThreadName=httpSSLWorkerThread-8080-0;|Starting sayHello|#]

> [#|2008-02-20T16:01:32.134+0100|SEVERE|sun-appserver9.1|com.sun.xml.ws.server.sei.EndpointMethodHandler|_ThreadID=24;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=d6f0f66b-791e-4f6c-a75b-0acc946fd98b;|The log message is null.
> javax.ejb.EJBException
> at
> com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:3869)
> at
> com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3769)
> at
> com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)
> at
> com.sun.ejb.containers.WebServiceInvocationHandler.invoke(WebServiceInvocationHandler.java:200)
> at $Proxy186.sayHello(Unknown Source)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> com.sun.enterprise.webservice.InvokerImpl.invoke(InvokerImpl.java:81)
> at
> com.sun.enterprise.webservice.EjbInvokerImpl.invoke(EjbInvokerImpl.java:82)
> at
> com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146)
> at
> com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)
> at
> com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93)
> at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
> at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
> at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
> at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
> at
> com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:106)
> at
> com.sun.enterprise.webservice.MonitoringPipe.process(MonitoringPipe.java:147)
> at
> com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115)
> at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
> at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
> at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
> at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
> at
> com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:106)
> at
> com.sun.xml.ws.tx.service.TxServerPipe.process(TxServerPipe.java:317)
> at
> com.sun.enterprise.webservice.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:218)
> at
> com.sun.enterprise.webservice.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:129)
> at
> com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115)
> at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595)
> at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554)
> at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539)
> at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436)
> at
> com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:243)
> at
> com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:444)
> at
> com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
> at
> com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135)
> at
> com.sun.enterprise.webservice.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:113)
> at
> com.sun.enterprise.webservice.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:87)
> at
> com.sun.enterprise.webservice.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:200)
> at
> com.sun.enterprise.webservice.EjbWebServiceServlet.service(EjbWebServiceServlet.java:129)
> at
> javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
> at
> com.sun.enterprise.web.AdHocContextValve.invoke(AdHocContextValve.java:114)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
> at
> com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:87)
> at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
> at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)
> at
> org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)
> at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1080)
> at
> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:637)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:568)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:813)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
> at
> com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
> at
> com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
> at
> com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
> at
> com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
> Caused by: java.lang.NullPointerException
> at test.middleware.HelloWorld.sayHello(HelloWorld.java:19)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)
> at
> com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)
> at
> com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)
> at
> com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)
> at
> com.sun.ejb.containers.WebServiceInvocationHandler.invoke(WebServiceInvocationHandler.java:189)
> ... 64 more
> |#]


> ####################### /Glassfish-Exception #######################



-- 
Mit freundlichen Grüßen
Stefan Schilling
mailto:mail.suse_at_gmx.de