Hi Reinahrd,
Reinhard Weiss wrote:
>
> hi werner,
>
> thanks again for your quick reply, and sorry for not sending an
example - i was quite sure there was a simple way of configuration using
a mapping file, which i have overseen.
>
> to your questions:
>
> -why not generate code from xsd?
>
> i am working with wsdl, which contains more than one schema section.
elements defined there are crosslinked via (target)namespaces. honestly,
i am not very pleased about extracting these schemas to generate code
for each.
Hmmm ... but that's exactly what I would recommend. Move the type
definitions out of the XML schema, and use a XML data binding tool
(Castor in your case) to generate the Java classes from those types.
What web service framework are you using, if I may ask ? There's plenty
out there who offer support for (un-)marshalling SOAP payloads through
Castor (incl. JAXB, XFire, spring-ws....)
>i prefer the 'manual way' of mapping my objects. i have hoped
> this way would be more robust to changes as well.
Why ? If there's a change to your data type (definitions) as maintained
in your XML schema(s), simply regenerate the sources.
>
> -is there an example?
>
> abstracting the real situation is a little bit tricky, but here we
> go:>
>
>
> public class A {
> private String name;
> private Map<String, B<String>> strings = new HashMap<String, B<String>>(3);
>
> public void setName(String name) {
> this.name = name;
> }
> public String getName() {
> return this.name;
> }
>
> public void addString(B<String> s) {
> this.strings.put(s.getName(), s);
> }
> public Map<String, B<String>> getStrings() {
> return this.strings;
> }
> }
>
>
>
> public B <T> {
> private T value;
> private String name;
>
> public void setValue(T value) {
> this.value = value;
> }
> public T getValue() {
> return this.value;
> }
>
> public void setName(String name) {
> this.name = name;
> }
> public String getName() {
> return this.name;
> }
> }
>
>
>
> <mapping>
> <!-- this mapping has not yet been pimped to qualify attributes -->
> <class name="com.xyz.A">
> <map-to xml="OBJECT"
> ns-uri="http://xyz.com"
> ns-prefix="p"/>
> <field name="name" type="string">
> <bind-xml name="objectName" node="attribute"/>
> </field>
> <field name="strings"
> collection="map" type="com.xyz.B"
> set-method="addString" get-method="getStrings">
> <bind-xml name="STRING" node="element"/>
> </field>
> </class>
>
> <class name="org.exolab.castor.mapping.MapItem">
> <field name="key" type="string" transient="true"/>
> <field name="value" type="com.xyz.B" container="true"/>
> </class>
>
> <class name="com.xyz.B">
> <map-to ns-uri="http://xyz.com"
> ns-prefix="p"/>
> <field name="name" type="string">
> <bind-xml node="attribute"/>
> </field>
> <field name="value" type="other">
> <bind-xml node="text"/>
> </field>
> </class>
>
> </mapping>
>
>
>
> the test
>
> public void testMarshalUnmarshal() {
> B<String> wordsOfWisdom = new B<String>();
> wordsOfWisdom.setValue("Hello World");
> wordsOfWisdom.setName("wordsOfWisdom");
> A myObject = new A();
> myObject.setName("myObject");
> myObject.addString(wordsOfWisdom);
>
> Mapping mapping = new Mapping();
> mapping.loadMapping("<location-of-mapping-file>");
>
> StringWriter writer = new StringWriter();
>
> marshaller.setWriter(writer);
> marshaller.setMapping(mapping);
> marshaller.marshal(myObject);
>
> String actual = writer.toString();
> if (logger.isDebugEnabled()) logger.debug(actual);
>
> Reader reader = new StringReader(actual);
>
> unmarshaller.setMapping(mapping);
> Object o = unmarshaller.unmarshal(reader);
>
> assertTrue(o instanceof A);
> assertEquals(myObject.getName(), ((A) o).getName());
> assertNotNull(((A) o).getStrings());
> assertEquals(1, ((A) o).getStrings().size());
> B<String> _wordsOfWisdom = ((A)
> o).getStrings().get(wordsOfWisdom.getName());
> assertNotNull(_wordsOfWisdom);
> assertEquals(wordsOfWisdom.getName(), _wordsOfWisdom.getName());
> assertEquals(wordsOfWisdom.getValue(), _wordsOfWisdom.getValue());
> }
>
>
>
> actual marshalled example output:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <p:OBJECT xmlns:p="http://xyz.com" objectName="myObject">
> <p:STRING name="wordsOfWisdom">Hello World</p:STRING>
> </p:OBJECT>
>
> desired output
>
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- attributes should be qualified -->
> <p:OBJECT xmlns:p="http://xyz.com" p:objectName="myObject">
> <p:STRING p:name="wordsOfWisdom">Hello World</p:STRING>
> </p:OBJECT>
>
>
>
> following your suggestion, i added an 'xmlns:p="http://xyz.com"' attribute on
> each <class> element level (which is not valid according to DTD) and fixed
> the <bind-xml> 'name' attribute. when i run my test (which is succesful with
> unqualified attributes) it fails with an SAXException complaining
>
> "unable to find FieldDescriptor for 'STRING' in ClassDescriptor of OBJECT{...}
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:732)
> at org.exolab.castor.xml.Unmarshaller.unmarshal(Unmarshaller.java:588)"
>
>
>
> hmm, i am not sure what to do next. do you have any suggestions once more?
I will need to look into this in more detail. Not sure when I will be
able to free some time for this, though.
>
>
> thx, reinhard!
>
>
> -----Ursprüngliche Nachricht-----
> Von: Werner Guttmann [mailto:[EMAIL PROTECTED]
> Gesendet: Mo 16.06.2008 20:22
> An: [email protected]
> Betreff: Re: [castor-user] how to qualify marshalled attributes?
>
> Actually, have a look at the following mapping for a very simple Entity
> class:
>
> <?xml version="1.0" ?>
> <!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
> "http://castor.org/mapping.dtd">
> <mapping>
>
> <class name="xml.reinhard.Entity" xmlns:r="http://test">
> <map-to xml="entity" ns-prefix="r" ns-uri="http://test"/>
> <field name="id" type="integer" >
> <bind-xml name="id" />
> </field>
> <field name="name" type="string">
> <bind-xml name="name" />
> </field>
> <field name="att" type="string">
> <bind-xml name="r:att" node="attribute" />
> </field>
> </class>
>
> </mapping>
>
> This works out of the box. Please *note* that removing the xmlns:r
> namespace declaration will cause a failure when unmarshalling the
> mapping file.
>
> I hope this helps.
>
> Werner
>
> Werner Guttmann wrote:
>> Reinhard,
>>
>> please read inline.
>>
>> Reinhard Weiss wrote:
>>> hi,
>>>
>>> is there a way to force qualification of attributes in the marshalled
>>> xml output (e.g. in case the schema defines
>>> attributeFormDefault="qualified")?
>> If you happen to have an XML schema at hands (and you last comment seems
>> to indicate this), why don't you generate domain classes and descriptor
>> classes from the XML schema, and things will be taken care of
>> automatically ?
>>
>>> qualification of elements can easily be done via the <map-to>
>>> element. but i have not found a way to define namespaces for
>>> attributes.
>> Can I assume that you are using a mapping file ?
>>> eg using the 'QName-prefix' in the <bind-xml> does not
>>> seem to have much effect.
>> Have you tried to use a <bind-xml> element such as
>>
>> <bind-xml name="a:attribute" />
>>
>> I know this might not feel right, but let's try to narrow this down
>> first ? If you had a *minimal * test case, please feel free to make it
>> available ? The less time I spend on setting things up, the more I cam
>> e.g. debug source code to see what's going wrong (in case this is a bug)
>> or what's missing configuration-wise.
>>
>>> thx,
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>
>>> DI Reinhard Weiss Java Developer
>>>
>>> ANECON Software Design und Beratung G.m.b.H. Alser Straße 4 / Hof 1
>>> A-1090 WIEN
>>>
>>> Tel.: +43 1 409 58 90-0 Fax: +43 1 409 58 90-998 Web:
>>> http://www.anecon.com
>>>
>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>
>>>
>>> Zusätzliche Pflichtangaben von Kapitalgesellschaften gem. § 14 UGB:
>>> FN166941b | Handelsgericht Wien | Firmensitz Wien
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe from this list, please visit:
>>>
>>> http://xircles.codehaus.org/manage_email
>>>
>>>
>> ---------------------------------------------------------------------
>> To unsubscribe from this list, please visit:
>>
>> http://xircles.codehaus.org/manage_email
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
> http://xircles.codehaus.org/manage_email
>
>
>
>
>
> ------------------------------------------------------------------------
>
> ---------------------------------------------------------------------
> To unsubscribe from this list, please visit:
>
> http://xircles.codehaus.org/manage_email
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email