Oh, and I should mention there's another way to get easy extensibility, which is to use attributes for simple values, rather than elements. You can use an xs:anyAttribute as part of your schema definition, and that will allow you to define new attributes in future iterations of the schema without breaking compatibility with existing clients.
Personally I prefer attributes for representing simple values, but some of the web services stacks tend to discourage them (such as .Net/WCF - they'd proposed dropping support for attributes completely at one point, though I doubt they'd ever be able to do this). - Dennis Dennis M. Sosnoski Java SOA and Web Services Consulting <http://www.sosnoski.com/consult.html> Axis2/CXF/Metro SOA and Web Services Training <http://www.sosnoski.com/training.html> Web Services Jump-Start <http://www.sosnoski.com/jumpstart.html> On 03/02/2011 01:20 PM, Dennis Sosnoski wrote: > Hi Buddhike, > > As I mentioned in my reply to a separate email on a similar issue, > it's possible to design your schemas with extension points for adding > more data in the future by using the xs:any element. The big > limitation is that if you want to use the same namespace for your > extension elements, the xs:any must be the last item in an xs:sequence > and must follow a required element (this is a somewhat stupid > limitation of XML schema). That's not so bad if you're only adding a > few extensions, but it causes problems when you want to provide an > updated schema that includes the extension elements. > > One way around this limitation is to use a new namespace for each set > of added elements, but this leads to namespace proliferation and a lot > of confusion. Another is to use an optional wrapper element around the > added content, but that also leads to ugliness since a new wrapper > element would be required for each set of extensions. > > So there's no easy way to get the kind of flexibility you want while > staying compatible with XML schema. JAXB will give you the client-side > flexibility, but it does this by basically ignoring the schema and > only processing the elements it understands. Clients using tools which > take the schema more seriously will fail with your added data. > > - Dennis > > > On 03/02/2011 12:09 PM, Buddhike de Silva wrote: >> >> Thanks Josef. I like your idea. But this would be a little >> complicated in terms of what we are trying to achieve. To put more >> context around... We are building a public Web Service. And we >> want to be interoperable with main stream Java stacks. When it comes >> to releasing the next version of the product, we want to ensure that >> our clients don't break regardless of the stack they are using. We >> also want to ensure we have the fastest upgrade path for certain >> things we consider as non breaking changes. >> >> One of them is adding a new optional member to type. We could >> consider that as a breaking change and version our endpoints >> accordingly but given the number of small changes we could >> anticipate, we'd rather avoid going down that path. However, we could >> only do that, if our clients using Java had the option to do lax >> visioning :-). >> >> We could use the dictionary based solution you mentioned. However, >> this would hide the strongly typed/hierarchical view of our data from >> our clients using the subsequent versions. >> >> Cheers, >> >> -Buddhike >> >> On Tue, Mar 1, 2011 at 6:21 PM, Stadelmann Josef >> <josef.stadelm...@axa-winterthur.ch >> <mailto:josef.stadelm...@axa-winterthur.ch>> wrote: >> >> Hi Buddhike >> >> >> >> Denis é all is right, breaking the contract is bad. But you can >> also think about how a collection would be serialized, given a >> collection of strings can be seen as a type. While this >> collection is i.e. a collection of elements and each element has >> name value pairs of type string. If you can serialize and >> de-serialize a collection then you can add as many elements as >> you like. This is our approach to exchange unforeseen amounts of >> screen data from transaction masks with our server up to the >> database tables. The axis2 client is very well in receiving and >> responding with AXIOM OMElement. And an OMElement can consist any >> series of nodes parent with child's and child's with siblings. >> >> >> >> The axis2 examples shows a service, guess one of the echo >> examples, how an OMElement is exchanged from an axis2 client with >> the axis2 server. >> >> Now it is up to you to add more nodes to this OMElement and send >> it to the server, and receive one from the server. If that works >> record what is exchanged an make the same between a WCF Client >> and a WCF Server. Then take a look at the difference using a SOAP >> Monitor or a TCPMONITOR. >> >> >> >> It’s a hard way but it works. >> >> >> >> Cheers >> >> >> >> *Von:* Buddhike de Silva [mailto:buddhike.desi...@geeksdiary.com >> <mailto:buddhike.desi...@geeksdiary.com>] >> *Gesendet:* Dienstag, 1. März 2011 08:33 >> *An:* Dennis Sosnoski >> *Cc:* java-user@axis.apache.org <mailto:java-user@axis.apache.org> >> *Betreff:* Re: Axis Serialization Behavior >> >> >> >> Thanks a lot Dennis. >> >> Cheers, >> >> -Buddhike >> >> On Tue, Mar 1, 2011 at 5:30 PM, Dennis Sosnoski <d...@sosnoski.com >> <mailto:d...@sosnoski.com>> wrote: >> >> Ah, I hadn't realized you were using Axis(1). With Axis2 you can >> select the data binding using a parameter to Wsdl2Java. You >> should be able to see examples included in the Axis2 download, or >> you can try my code from this article: >> http://www.ibm.com/developerworks/java/library/j-jws8.html I >> haven't tried the code from the article with the latest Axis2 >> releases, but hopefully it'll still work correctly. >> >> - Dennis >> >> >> >> >> On 03/01/2011 07:58 PM, Buddhike de Silva wrote: >> >> Thanks Dennis. Do you know of a link with some sample code on how >> to do this? Sorry, I'm not really familier with Axis2. Thanks again. >> >> Cheers, >> >> -Buddhike >> >> On Tue, Mar 1, 2011 at 4:46 PM, Dennis Sosnoski <d...@sosnoski.com >> <mailto:d...@sosnoski.com>> wrote: >> >> Hi Buddhike, >> >> The handling of unexpected XML elements is determined by the data >> binding technique used. JAXB is the sloppiest data binding >> supported by Axis2 (on a par with WCF), and if you change to that >> you should be ok. >> >> - Dennis >> >> Dennis M. Sosnoski >> Java SOA and Web Services Consulting >> <http://www.sosnoski.com/consult.html> >> Axis2/CXF/Metro SOA and Web Services Training >> <http://www.sosnoski.com/training.html> >> Web Services Jump-Start <http://www.sosnoski.com/jumpstart.html> >> >> >> On 02/28/2011 10:17 PM, Buddhike de Silva wrote: >> >> Anyone? (please... :-)) >> >> On Sun, Feb 27, 2011 at 4:28 PM, Buddhike de Silva >> <buddhike.desi...@geeksdiary.com >> <mailto:buddhike.desi...@geeksdiary.com>> wrote: >> >> Hi All, >> >> We are doing some interop tests between Axis and WCF. In our WCF >> service we have a type like this. >> >> [DataContract] >> >> public class CompositeType >> >> { >> >> [DataMemeber] >> >> public bool BoolValue {get; set;} >> >> } >> >> That results in a schema similar to the following. >> >> <xs:complexType name="CompositeType"> >> <xs:sequence> >> <xs:element name="BoolValue" type="xs:boolean" minOccurs="0"/> >> </xs:sequence> >> </xs:complexType> >> <xs:element name="CompositeType" type="tns:CompositeType" >> nillable="true"/> >> >> >> We can generate Axis code with the WSDL/Schema generated by WCF >> service and communicate with the service. However, if we add >> another property to CompositeType class on the WCF server side, >> it breaks the Axis client. It throws an exception saying it's >> reading an element that was unexpected. Our understanding Axis is >> capable of lax processing of XML (that is, if it encounters >> anything that's not recognized, serializer simply discards them). >> Could someone pleasae let us know which settings we should use to >> enable lax processing of messages? Many thanks in advance. >> >> Cheers, >> >> -Buddhike >> >> >> >> >> >> >> >>