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
