users@jax-rpc.java.net

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

From: Tim Lucia <timlucia_at_yahoo.com>
Date: Tue, 30 Mar 2004 10:17:30 -0500

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