On Wednesday 03 October 2007, Benson Margulies wrote:
> Is this the 'nillable' / 'minOccurs' issue?

This is slightly different but comes down to the same solution.   That 
issue is basically that we treat an empty list exactly the same on the 
wire as a null list.   With the normal jaxb mapping, there isn't a way 
to say weather the list was null or empty.   Either way ends up with no 
data at all written out on the wire.   You end up having to create a 
wrapper type that is then nillable.

Dan

>
> > -----Original Message-----
> > From: Daniel Kulp [mailto:[EMAIL PROTECTED]
> > Sent: Wednesday, October 03, 2007 7:47 AM
> > To: [email protected]
> > Cc: Kaleb Walton
> > Subject: Re: Empty List's not being marshaled?
> >
> > On Wednesday 03 October 2007, Kaleb Walton wrote:
> > > Do you know why that is the case? Maybe because since it's empty
>
> they
>
> > > figured there shouldn't be any wasted space in the XML doc?
> >
> > It's probably a combination of:
> > 1) Less bandwidth used on the wire
> >
> > 2) Mappings in other toolkits - toolkits like JAXB and .NET and
>
> JAX-RPC,
>
> > etc.... usually map the "wrapper" type to an object that holds the
>
> list
>
> > or array, but would map the current thing directly to an array or
>
> list.
>
> > That simplifies the programming model.
> >
> > 2) Simplified schema.   You don't end up with a wrapper type for
> > every list.   Imaging, for example, a method that takes 3 lists.  
> > With wrapped/doc/lit, you currently end up with something like:
> > <element name="doFooRequest">
> >  <complexType>
> >   <sequence>
> >     <element name="foo" type="string"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> >     <element name="bar" type="long"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> >     <element name="snarf" type="float"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> > </sequence>
> > <complexType>
> > </element>
> >
> > If you had to wrap all the lists up, it would be something like:
> > <complexType name="StringList">
> >   <sequence>
> >     <element name="item" type="string"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> >   </sequence>
> > <complexType>
> > <complexType name="IntList">
> >   <sequence>
> >     <element name="item" type="int"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> >   </sequence>
> > <complexType>
> > <complexType name="FloatList">
> >   <sequence>
> >     <element name="item" type="float"
> >            minOccurs="0" maxOccurs="unbounded" nillable="true"/>
> >   </sequence>
> > <complexType>
> > <element name="doFooRequest">
> >  <complexType>
> >   <sequence>
> >     <element name="foo" type="tns:StringList"/>
> >     <element name="bar" type="tns:IntList"/>
> >     <element name="snarf" type="tns:FloatList"/>
> > </sequence>
> > <complexType>
> > </element>
> >
> > Basically, you end up with a significantly larger schema.
> >
> > Dan
> >
> > > It's a pain for my consumers to have to check for the existence of
> > > a variable before trying to parse it out - not the end of the
> > > world
>
> but
>
> > > it adds somewhat redundant code.
> > >
> > >
> > > Regards,
> > > Kaleb
> > >
> > > |------------>
> > > | From:      |
> > > |------------>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >   >
> > >   |Daniel Kulp <[EMAIL PROTECTED]>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > > |
> > > |------------>
> > > | To:        |
> > > |------------>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >   >
> > >   |[email protected]
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > > |
> > > |------------>
> > > | Cc:        |
> > > |------------>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >   >
> > >   |Kaleb Walton/Southfield/[EMAIL PROTECTED]
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > > |
> > > |------------>
> > > | Date:      |
> > > |------------>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >   >
> > >   |10/02/2007 05:55 PM
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > > |
> > > |------------>
> > > | Subject:   |
> > > |------------>
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >   >
> > >   |Re: Empty List's not being marshaled?
> >
> >-------------------------------------------------------------------
> >
> >-------------------------------------------------------------------
> >
> > >   >------------|
> > >
> > > On Tuesday 02 October 2007, Kaleb Walton wrote:
> > > > I'm using the simple server configured via Spring. When an
> > > > object contains an empty list (not null) my response does not
> > > > return it
>
> as
>
> > > > an empty list - it just excludes the property from the response.
>
> Is
>
> > > > there any way to force it to include the property?
> > >
> > > I'd probably have to see both the schema and the soap message.
>
> Most
>
> > > likely, the answer is no without creating a holder bean to hold
> > > the list.
> > >
> > > For the most part, when we see something like List<String>, we
> > > just create:
> > > <element name="foo" type="string" maxOccurs="unbounded"
> > > nillable="true"/>
> > >
> > > In that case, if the list is empty (or even if the list is null),
> > > nothing representing the list will appear on the wire.   That is
> > > how the JAXB spec calls for it to be done.  If you want something
> > > always on the wire, the schema would have to be something like:
> > > <element name="fooList">
> > > <complexType>
> > > <sequence>
> > > <element name="foo" type="string" maxOccurs="unbounded"
> > > nillable="true"/> </sequence>
> > > <complexType>
> > > </element>
> > >
> > > and a "FooList" class would be created to hold the List<String>.
> > >
> > > --
> > > J. Daniel Kulp
> > > Principal Engineer
> > > IONA
> > > P: 781-902-8727    C: 508-380-7194
> > > [EMAIL PROTECTED]
> > > http://www.dankulp.com/blog
> >
> > --
> > J. Daniel Kulp
> > Principal Engineer
> > IONA
> > P: 781-902-8727    C: 508-380-7194
> > [EMAIL PROTECTED]
> > http://www.dankulp.com/blog



-- 
J. Daniel Kulp
Principal Engineer
IONA
P: 781-902-8727    C: 508-380-7194
[EMAIL PROTECTED]
http://www.dankulp.com/blog

Reply via email to