OK - I *think* I have a solution. The following seems to allow me to
(a) avoid changing the document syntax, (b) validation/parsing works
properly, and (c) wsdl2java seems to generate sane code. The cost is
some minimal extra complexity in the schema and an extra generated java
class.
<complexType name="FilterList">
<sequence>
<group ref="FilterElement" minOccurs="0"
maxOccurs="unbounded"/>
</sequence>
</complexType>
<group name="FilterElement">
<choice>
<element name="and" type="query:AndFilter"/>
<element name="or" type="query:OrFilter"/>
<element name="not" type="query:NotFilter"/>
</choice>
</group>
Essentially, wsdl2java ignores min/max on sequence and choice (and
probably any), but does the right thing when applied to element and
group refs.
You'll get an intermediate class, of course, leaving you with something
like:
class FilterList {
FilterElement[] filterElement;
}
class FilterElement {
AndFilter andFilter;
OrFilter orFilter;
NotFilter notFilter;
}
At first glance, at least, this seems to be a reasonable match for the
intent.
Michael Thome wrote:
Ack - you are correct. I only looked at the generated code (which
looks fine) and tried validating against an example that turned out to
be too simple.
Now I don't know... Any workaround would be extremely welcome, as I
need this to work, also.
I really don't want to have to put more tags in, e.g. What ought to
work is something like:
<complexType name="FilterList">
<sequence>
<element name="bogus" minOccurs="1" maxOccurs="unbounded">
<complexType>
<choice>
<element name="and" type="query:AndFilter"/>
<element name="or" type="query:OrFilter"/>
<element name="not" type="query:NotFilter"/>
</choice>
</complexType>
</element>
</sequence>
</complexType>
but the I'd have to do:
<list>
<bogus><and/></bogus>
<bogus><or/></bogus>
<bogus><and/></bogus>
</list>
Ugh.
Bill Keese wrote:
Mik,
Thanks for the answer. But I think your work around won't permit data
like this:
<list>
<and>...</and>
<or>...</or>
<not>...</not>
<and>...</and>
</list>
Ie, I want to make lists containing different kinds of elements. With
your solution I'm restricted to a list containing one type of
element. (Or to put it another way - I want something like a java
Collection)
Michael Thome wrote:
Having just gone through a similar exercise:
1. I think the correct approach ought to be to attach the min/max
attributes to the choice rather than to the sequence - e.g. you want a
single sequence of any number of a choice of {and,or,not} elements, not
any number of sequences of a single choice.
2. but: although both can be used perfectly fine with the expected
documents and validation, wsdl2java appears to silently ignore min/max
attributes on non-element declarations.
3. A search of Jira shows several relevant outstanding bugs:
http://issues.apache.org/jira/browse/AXIS-236
http://issues.apache.org/jira/browse/AXIS-600
Until fixed, I think the only way to work around the problem is by
putting the min/maxOccurs on the elements, e.g:
<complexType name="FilterList">
<sequence>
<choice>
<element name="and" type="query:AndFilter" minOccurs="1" maxOccurs="unbounded"/>
<element name="or" type="query:OrFilter" minOccurs="1" maxOccurs="unbounded"/>
<element name="not" type="query:NotFilter" minOccurs="1" maxOccurs="unbounded"/>
</choice>
</sequence>
</complexType>
cheers,
mik
Bill Keese wrote:
It looks like WSDL2Java doesn't support xsd:choice for Axis 1.2. Can
anyone confirm/deny this?
I had a declaration like this:
<complexType name="FilterList">
<sequence minOccurs="1" maxOccurs="unbounded">
<choice>
<element name="and" type="query:AndFilter"/>
<element name="or" type="query:OrFilter"/>
<element name="not" type="query:NotFilter"/>
</choice>
</sequence>
</complexType>
I expected the generated java code to look like this:
class FilterList {
Filters[] filters;
}
But instead it's a strange class like below. The problem w/the class
below is that you can't have a FilterList containing two or more "and"
nodes.
public class FilterList implements java.io.Serializable {
private jp.co.beacon_it.inicio.client.soap.schema.query.AndFilter and;
private jp.co.beacon_it.inicio.client.soap.schema.query.OrFilter or;
private jp.co.beacon_it.inicio.client.soap.schema.query.NotFilter not;
...
}
|