users@jax-rpc.java.net

Re: Returning a Collection (List (LinkedList)) of java beans

From: Doug Kohlert <Doug.Kohlert_at_Sun.COM>
Date: Tue, 30 Mar 2004 10:21:09 -0800

Tim,
When generating your client from the WSDL did you use the
-f:searchschema flag?

Tim Lucia wrote:

>Hi,
>
>I've read all about how JAX-RPC (as supplied with JWSDP 1.3) supports
>Collection classes, including List and LinkedList. I have been trying
>(for several days) to return a LinkedList of beans from one of my
>functions. I can return a LinkedList of String objects without problem,
>but returing a list of my object always gives me a deserialization
>error.
>
>For simplicity, I have reproduced this using the tutorial 'jaxrpc-hello'
>example, in both the static stub and dynamic proxy clients. I've
>extended this example to have a "sayHelloList()" return a List of String
>objects (works) and a list of Foo objects (does not work.) I am using
>the ant build process in the tutorial otherwise untouched (except for
>including compilation units for Foo.java/Foo.class where necessary.) I
>also tried returning an array of String (works) and an array of Foo
>(does not work).
>
>It has to be that I am missing some configuration something-or-other
>that tells the client that the List contains "Foo" objects, while it is
>smart enough to figure out String on its own. I tried adding (to my
>config-interface.xml) <typeMappingRegistry><additionalTypes><class
>name="hello.Foo"/><class
>name="java.util.LinkedList"/></additionalTypes></typeMappingRegistry>
>which did not seem to help. I even made Foo implement Serializable
>which didn't change anything either.
>
>BTW, A single Foo getFoo() object DOES return Foo correctly.
>
>Thanks in advance for any input.
>Tim Lucia
>
>
>-----Foo.java-----
>/* A really simple Java Bean */
>package hello;
>public class Foo
>{
> private int intVal;
> private String stringVal = null;
>
> public void setStringVal(String val) { stringVal = val; }
> public String getStringVal() { return stringVal; }
> public void setIntVal(int val) { intVal = val; }
> public int getIntVal() { return intVal; }
> public String toString() { return intVal + ":" + stringVal; }
>}
>
>-----HelloIF.java-----
>package helloservice;
>
>import java.rmi.Remote;
>import java.rmi.RemoteException;
>
>public interface HelloIF extends Remote {
> public String sayHello(String s) throws RemoteException;
> public java.util.List sayHelloList(String s) throws RemoteException;
> public java.util.List getFooList() throws RemoteException;
>}
>
>-----HelloImpl.java-----
>package helloservice;
>import hello.Foo;
>public class HelloImpl implements HelloIF {
>
> public String message = "Hello ";
>
> public String sayHello(String s) {
> return message + s;
> }
>
> public java.util.List sayHelloList(String s) {
> java.util.List list = new java.util.LinkedList();
> list.add(message);
> list.add(s);
> return list;
> }
>
> public java.util.List getFooList() {
> java.util.List list = new java.util.LinkedList();
> Foo
> foo = new Foo(); foo.setIntVal(1); foo.setStringVal("Tim");
>list.add(foo);
> foo = new Foo(); foo.setIntVal(1); foo.setStringVal("Tim");
>list.add(foo);
> foo = new Foo(); foo.setIntVal(1); foo.setStringVal("Tim");
>list.add(foo);
> foo = new Foo(); foo.setIntVal(1); foo.setStringVal("Tim");
>list.add(foo);
> return list;
> }
>}
>
>-----WSDL-----
><?xml version="1.0" encoding="UTF-8"?>
><definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
>xmlns:tns="urn:Foo" xmlns:ns2="http://java.sun.com/jax-rpc-ri/internal"
>xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="MyHelloService"
>targetNamespace="urn:Foo">
> <types>
> <schema xmlns="http://www.w3.org/2001/XMLSchema"
>xmlns:tns="http://java.sun.com/jax-rpc-ri/internal"
>xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
>targetNamespace="http://java.sun.com/jax-rpc-ri/internal">
> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> <import namespace="urn:Foo"/>
> <complexType name="list">
> <complexContent>
> <extension base="tns:collection">
> <sequence/></extension></complexContent></complexType>
> <complexType name="collection">
> <complexContent>
> <restriction base="soap11-enc:Array">
> <attribute ref="soap11-enc:arrayType"
>wsdl:arrayType="anyType[]"/></restriction></complexContent></complexType
>
>
> <complexType name="linkedList">
> <complexContent>
> <extension base="tns:list">
>
><sequence/></extension></complexContent></complexType></schema>
> <schema xmlns="http://www.w3.org/2001/XMLSchema"
>xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:Foo">
> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
> <import namespace="http://java.sun.com/jax-rpc-ri/internal"/>
> <complexType name="Foo">
> <sequence>
> <element name="intVal" type="int"/>
> <element name="stringVal"
>type="string"/></sequence></complexType></schema></types>
> <message name="HelloIF_getFooList"/>
> <message name="HelloIF_getFooListResponse">
> <part name="result" type="ns2:list"/></message>
> <message name="HelloIF_sayHello">
> <part name="String_1" type="xsd:string"/></message>
> <message name="HelloIF_sayHelloResponse">
> <part name="result" type="xsd:string"/></message>
> <message name="HelloIF_sayHelloList">
> <part name="String_1" type="xsd:string"/></message>
> <message name="HelloIF_sayHelloListResponse">
> <part name="result" type="ns2:list"/></message>
> <portType name="HelloIF">
> <operation name="getFooList" parameterOrder="">
> <input message="tns:HelloIF_getFooList"/>
> <output message="tns:HelloIF_getFooListResponse"/></operation>
> <operation name="sayHello" parameterOrder="String_1">
> <input message="tns:HelloIF_sayHello"/>
> <output message="tns:HelloIF_sayHelloResponse"/></operation>
> <operation name="sayHelloList" parameterOrder="String_1">
> <input message="tns:HelloIF_sayHelloList"/>
> <output
>message="tns:HelloIF_sayHelloListResponse"/></operation></portType>
> <binding name="HelloIFBinding" type="tns:HelloIF">
> <operation name="getFooList">
> <input>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></input>
> <output>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></output>
> <soap:operation soapAction=""/></operation>
> <operation name="sayHello">
> <input>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></input>
> <output>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></output>
> <soap:operation soapAction=""/></operation>
> <operation name="sayHelloList">
> <input>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></input>
> <output>
> <soap:body
>encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"
>namespace="urn:Foo"/></output>
> <soap:operation soapAction=""/></operation>
> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
>style="rpc"/></binding>
> <service name="MyHelloService">
> <port name="HelloIFPort" binding="tns:HelloIFBinding">
> <soap:address xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
>location="http://127.0.0.1:8080/hello-jaxrpc/hello"/></port></service></
>definitions>
>
>-----Ant run output-----
>
>E:\jwsdp-1.3\jwstutorial13\examples\jaxrpc\staticstub>\jwsdp-1.3\apache-
>ant\bin\ant run
>Buildfile: build.xml
>
>run-client:
> [java] Endpoint address = http://localhost:8080/hello-jaxrpc/hello
> [java] Hello Duke!
> [java] 2
> [java] [0]=Hello
> [java] [1]=Tim!
> [java] java.rmi.RemoteException: Runtime exception; nested
>exception is:
> [java] deserialization error: deserialization error: no
>deserializer is registered for (null, {urn:Foo}Foo)
> [java] at
>com.sun.xml.rpc.client.StreamingSender._handleRuntimeExceptionInSend(Str
>eamingSender.java:248)
> [java] at
>com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:230)
> [java] at
>staticstub.HelloIF_Stub.getFooList(HelloIF_Stub.java:67)
> [java] at staticstub.HelloClient.main(Unknown Source)
> [java] Caused by: deserialization error: deserialization error: no
>deserializer is registered for (null, {urn:Foo}Foo)
> [java] at
>com.sun.xml.rpc.encoding.SOAPDeserializationContext.deserializeMultiRefO
>bjects(SOAPDeserializationContext.java:82
>)
> [java] at
>com.sun.xml.rpc.client.StreamingSender._send(StreamingSender.java:163)
> [java] ... 2 more
>
>run:
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: users-unsubscribe_at_jax-rpc.dev.java.net
>For additional commands, e-mail: users-help_at_jax-rpc.dev.java.net
>
>
>
>

-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Doug Kohlert
Sun Microsystems, Inc.            
503-345-9806  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NOTICE:  This email message is for the sole use of the intended
recipient(s) and may contain confidential and privileged
information.  Any unauthorized review, use, disclosure or
distribution is prohibited.  If you are not the intended
recipient, please contact the sender by reply email and destroy
all copies of the original message.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe_at_jax-rpc.dev.java.net
For additional commands, e-mail: users-help_at_jax-rpc.dev.java.net