oxm.xml 34.4 KB
Newer Older
1
<?xml version="1.0" encoding="UTF-8"?>
2 3 4 5
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xi="http://www.w3.org/2001/XInclude"
    xml:id="oxm">
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    <title>Marshalling XML using O/X Mappers</title>

    <section id="oxm-introduction">
        <title>Introduction</title>
        <para>
            In this chapter, we will describe Spring's Object/XML Mapping support. Object/XML Mapping, or O/X mapping
            for short, is the act of converting an XML document to and from an object. This conversion process is also
            known as XML Marshalling, or XML Serialization. This chapter uses these terms interchangeably.
        </para>
        <para>
            Within the field of O/X mapping, a <emphasis>marshaller</emphasis> is responsible for serializing an 
            object (graph) to XML. In similar fashion, an <emphasis>unmarshaller</emphasis> deserializes the XML to an
            object graph. This XML can take the form of a DOM document, an input or output stream, or a SAX handler.
        </para>
        <para>Some of the benefits of using Spring for your O/X mapping needs are:</para>
        <formalpara>
            <title>Ease of configuration</title>
            <para>
                Spring's bean factory makes it easy to configure marshallers, without needing to construct JAXB context,
                JiBX binding factories, etc. The marshallers can be configured as any other bean in your application
                context. Additionally, XML Schema-based configuration is available for a number of marshallers, making
                the configuration even simpler.
            </para>
        </formalpara>
        <formalpara>
            <title>Consistent Interfaces</title>
            <para>
                Spring's O/X mapping operates through two global interfaces: the 
                <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename> interface. 
                These abstractions allow you to switch O/X mapping 
                frameworks with relative ease, with little or no changes required on the classes that do the 
                marshalling. This approach has the additional benefit of making it possible to do XML marshalling with 
                a mix-and-match approach (e.g. some marshalling performed using JAXB, other using XMLBeans) in a 
                non-intrusive fashion, leveraging the strength of each technology.
            </para>
        </formalpara>
        <formalpara>
            <title>Consistent Exception Hierarchy</title>
            <para>
                Spring provides a conversion from exceptions from the underlying O/X mapping tool to its own exception
                hierarchy with the <classname>XmlMappingException</classname> as the root exception. As can be expected,
                these runtime exceptions wrap the original exception so no information is lost.
            </para>
        </formalpara>
    </section>
    <section id="oxm-marshaller-unmarshaller">
        <title>Marshaller and Unmarshaller</title>
        <para>
            As stated in the introduction, a <emphasis>marshaller</emphasis> serializes an object to XML, and an
            <emphasis>unmarshaller</emphasis> deserializes XML stream to an object. In this section, we will describe
            the two Spring interfaces used for this purpose.
        </para>
        <section>
            <title>Marshaller</title>
            <para>
                Spring abstracts all marshalling operations behind the 
                <interfacename>org.springframework.oxm.Marshaller</interfacename> interface, the main methods of which 
                is listed below.
64
                <programlisting language="java"><![CDATA[
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
public interface Marshaller {

    /**
     * Marshals the object graph with the given root into the provided Result.
     */
    void marshal(Object graph, Result result)
        throws XmlMappingException, IOException;
}]]></programlisting>
                The <interfacename>Marshaller</interfacename> interface has one main method, which marshals the given
                object to a given <interfacename>javax.xml.transform.Result</interfacename>. Result is a tagging 
                interface that basically represents an XML output abstraction: concrete implementations wrap various XML
                representations, as indicated in the table below.
                <informaltable>
                    <tgroup cols="2">
                        <thead>
                            <row>
A
Arjen Poutsma 已提交
81
                                <entry><interfacename>Result</interfacename> implementation</entry>
82 83 84 85 86
                                <entry>Wraps XML representation</entry>
                            </row>
                        </thead>
                        <tbody>
                            <row>
A
Arjen Poutsma 已提交
87
                                <entry><classname>DOMResult</classname></entry>
88 89 90
                                <entry><interfacename>org.w3c.dom.Node</interfacename></entry>
                            </row>
                            <row>
A
Arjen Poutsma 已提交
91
                                <entry><classname>SAXResult</classname></entry>
92 93 94
                                <entry><interfacename>org.xml.sax.ContentHandler</interfacename></entry>
                            </row>
                            <row>
A
Arjen Poutsma 已提交
95
                                <entry><interfacename>StreamResult</interfacename></entry>
96 97 98 99 100 101 102 103 104 105 106
                                <entry>
                                    <classname>java.io.File</classname>,
                                    <classname>java.io.OutputStream</classname>, or
                                    <classname>java.io.Writer</classname>
                                </entry>
                            </row>
                        </tbody>
                    </tgroup>
                </informaltable>
                <note>
                    <para>
107
                        Although the <methodname>marshal()</methodname> method accepts a plain object as its first 
108
                        parameter, most <classname>Marshaller</classname> implementations cannot handle arbitrary 
A
Arjen Poutsma 已提交
109 110 111
                        objects. Instead, an object class must be mapped in a mapping file, marked with an annotation,
                        registered with the marshaller, or have a common base class. Refer to the further sections
                        in this chapter to determine how your O/X technology of choice manages this.
112 113 114 115 116 117 118 119 120
                    </para>
                </note>
            </para>
        </section>
        <section>
            <title>Unmarshaller</title>
            <para>
                Similar to the <interfacename>Marshaller</interfacename>, there is the 
                <interfacename>org.springframework.oxm.Unmarshaller</interfacename> interface.
121
                <programlisting language="java"><![CDATA[
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
public interface Unmarshaller {

    /**
     * Unmarshals the given provided Source into an object graph.
     */
    Object unmarshal(Source source)
        throws XmlMappingException, IOException;
}]]></programlisting>
                This interface also has one method, which reads from the given 
                <interfacename>javax.xml.transform.Source</interfacename> (an XML input abstraction), and returns the
                object read. As with Result, Source is a tagging interface that has three concrete implementations. Each
                wraps a different XML representation, as indicated in the table below.
                <informaltable>
                    <tgroup cols="2">
                        <thead>
                            <row>
A
Arjen Poutsma 已提交
138
                                <entry><interfacename>Source</interfacename> implementation</entry>
139 140 141 142 143
                                <entry>Wraps XML representation</entry>
                            </row>
                        </thead>
                        <tbody>
                            <row>
A
Arjen Poutsma 已提交
144
                                <entry><classname>DOMSource</classname></entry>
145 146 147
                                <entry><interfacename>org.w3c.dom.Node</interfacename></entry>
                            </row>
                            <row>
A
Arjen Poutsma 已提交
148
                                <entry><classname>SAXSource</classname></entry>
149 150 151 152 153 154
                                <entry>
                                    <classname>org.xml.sax.InputSource</classname>, and
                                    <interfacename>org.xml.sax.XMLReader</interfacename>
                                </entry>
                            </row>
                            <row>
A
Arjen Poutsma 已提交
155
                                <entry><classname>StreamSource</classname></entry>
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
                                <entry>
                                    <classname>java.io.File</classname>,
                                    <classname>java.io.InputStream</classname>, or
                                    <classname>java.io.Reader</classname>
                                </entry>
                            </row>
                        </tbody>
                    </tgroup>
                </informaltable>
            </para>
        </section>
        <para>
            Even though there are two separate marshalling interfaces (<interfacename>Marshaller</interfacename>
            and <interfacename>Unmarshaller</interfacename>), all implementations found in Spring-WS implement both in
            one class. This means that you can wire up one marshaller class and refer to it both as a marshaller and an 
            unmarshaller in your <filename>applicationContext.xml</filename>.
        </para>
        <section>
            <title>XmlMappingException</title>
            <para>
                Spring converts exceptions from the underlying O/X mapping tool to its own exception hierarchy with the
                <classname>XmlMappingException</classname> as the root exception. As can be expected, these runtime
                exceptions wrap the original exception so no information will be lost.
            </para>
            <para>
                Additionally, the <classname>MarshallingFailureException</classname> and
                <classname>UnmarshallingFailureException</classname> provide a distinction between marshalling and
                unmarshalling operations, even though the underlying O/X mapping tool does not do so.
            </para>
            <para>
                The O/X Mapping exception hierarchy is shown in the following figure:
                <mediaobject>
A
Arjen Poutsma 已提交
188 189
                    <imageobject>
                        <imagedata fileref="images/oxm-exceptions.png" align="center"/>
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
                    </imageobject>
                    <caption>
                        <para>
                            O/X Mapping exception hierarchy
                        </para>
                    </caption>
                </mediaobject>
            </para>
        </section>
    </section>
    <section id="oxm-usage">
        <title>Using Marshaller and Unmarshaller</title>
        <para>
            Spring's OXM can be used for a wide variety of situations. In the following example, we will use it to
            marshal the settings of a Spring-managed application as an XML file. We will use a simple JavaBean to
            represent the settings:
206
            <programlisting language="java"><![CDATA[
207 208 209 210 211 212 213 214 215 216 217 218 219 220
public class Settings {
    private boolean fooEnabled;

    public boolean isFooEnabled() {
        return fooEnabled;
    }

    public void setFooEnabled(boolean fooEnabled) {
        this.fooEnabled = fooEnabled;
    }
}]]></programlisting>
        </para>
        <para>
            The application class uses this bean to store its settings. Besides a main method, the class has two
221 222 223
            methods: <methodname>saveSettings()</methodname> saves the settings bean to a file named
            <filename>settings.xml</filename>, and <methodname>loadSettings()</methodname> loads these settings again. A
            <methodname>main()</methodname> method constructs a Spring application context, and calls these two methods.
224
            <programlisting language="java"><![CDATA[
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;

public class Application {
    private static final String FILE_NAME = "settings.xml";
    private Settings settings = new Settings();
    private Marshaller marshaller;
    private Unmarshaller unmarshaller;

    public void setMarshaller(Marshaller marshaller) {
        this.marshaller = marshaller;
    }

    public void setUnmarshaller(Unmarshaller unmarshaller) {
        this.unmarshaller = unmarshaller;
    }

    public void saveSettings() throws IOException {
        FileOutputStream os = null;
        try {
            os = new FileOutputStream(FILE_NAME);
            this.marshaller.marshal(settings, new StreamResult(os));
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

    public void loadSettings() throws IOException {
        FileInputStream is = null;
        try {
            is = new FileInputStream(FILE_NAME);
            this.settings = (Settings) this.unmarshaller.unmarshal(new StreamSource(is));
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        ApplicationContext appContext =
            new ClassPathXmlApplicationContext("applicationContext.xml");
        Application application = (Application) appContext.getBean("application");
        application.saveSettings();
        application.loadSettings();
    }
}]]></programlisting>
            The <classname>Application</classname> requires both a <property>marshaller</property>
            and <property>unmarshaller</property> property to be set. We can do so using the following
            <filename>applicationContext.xml</filename>:
285
            <programlisting language="xml"><![CDATA[
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
<beans>
    <bean id="application" class="Application">
        <property name="marshaller" ref="castorMarshaller" />
        <property name="unmarshaller" ref="castorMarshaller" />
    </bean>
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/>
</beans>
]]></programlisting>
            This application context uses Castor, but we could have used any of the other marshaller instances described
            later in this chapter. Note that Castor does not require any further configuration by default, so the bean
            definition is rather simple. Also note that the <classname>CastorMarshaller</classname> implements both
            <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename>, so we can refer
            to the <varname>castorMarshaller</varname> bean in both the <property>marshaller</property> and
            <property>unmarshaller</property> property of the application.
        </para>
        <para>
            This sample application produces the following <filename>settings.xml</filename> file:
303
            <programlisting language="xml"><![CDATA[
304 305 306 307 308 309 310 311 312 313
<?xml version="1.0" encoding="UTF-8"?>
<settings foo-enabled="false"/>
]]></programlisting>
        </para>
    </section>
	<section>
       	<title>XML Schema-based Configuration</title>
       	<para>
       		Marshallers could be configured more concisely using tags from the OXM namespace.
       		To make these tags available, the appropriate schema has to be referenced first in the preamble of the XML configuration file.
314
       		Note the 'oxm' related text below:
315
       	</para>
316
       	<programlisting language="xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    ]]><emphasis role="bold"><![CDATA[xmlns:oxm="http://www.springframework.org/schema/oxm"]]></emphasis>
    <![CDATA[xsi:schemaLocation="http://www.springframework.org/schema/beans
    ]]><![CDATA[http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    ]]><emphasis role="bold"><![CDATA[http://www.springframework.org/schema/oxm
    ]]><![CDATA[http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd"]]></emphasis><![CDATA[>
]]></programlisting>
		<para>
			Currently, the following tags are available:
			<itemizedlist>
				<listitem>
					<para><link linkend="oxm-jaxb2-xsd"><literal>jaxb2-marshaller</literal></link></para>
				</listitem>
				<listitem>
					<para><link linkend="oxm-xmlbeans-xsd"><literal>xmlbeans-marshaller</literal></link></para>
				</listitem>
				<listitem>
					<para><link linkend="oxm-jibx-xsd"><literal>jibx-marshaller</literal></link></para>
				</listitem>
			</itemizedlist>
		</para>
		<para>
			Each tag will be explained in its respective marshaller's section. As an example though, here is how
			the configuration of a JAXB2 marshaller might look like:
		</para>
343
		<programlisting language="xml"><![CDATA[<oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.ws.samples.airline.schema"/>]]></programlisting>
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
    </section>    
    <section id="oxm-jaxb">
        <title>JAXB</title>
        <para>
            The JAXB binding compiler translates a W3C XML Schema into one or more Java classes, a 
            <filename>jaxb.properties</filename> file, and possibly some resource files. JAXB also offers a 
            way to generate a schema from annotated Java classes.
        </para>
        <para>
            Spring supports the JAXB 2.0 API as XML marshalling strategies, following the
            <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename>
            interfaces described in <xref linkend="oxm-marshaller-unmarshaller"/>. The corresponding integration 
            classes reside in the <package>org.springframework.oxm.jaxb</package> package.
        </para>
        <section id="oxm-jaxb2">
            <title>Jaxb2Marshaller</title>
            <para>
                The <classname>Jaxb2Marshaller</classname> class implements both the Spring
                <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename>interface. It
                requires a context path to operate, which you can set using the <property>contextPath</property>
                property. The context path is a list of colon (:) separated Java package names that contain schema
                derived classes. It also offers a <property>classesToBeBound</property> property, which allows you to set an array of 
                classes to be supported by the marshaller. Schema validation is performed by specifying one or more 
                schema resource to the bean, like so:
            </para>
369
            <programlisting language="xml"><![CDATA[
370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
<beans>

    <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>org.springframework.oxm.jaxb.Flight</value>
                <value>org.springframework.oxm.jaxb.Flights</value>                
            </list>
        </property>
        <property name="schema" value="classpath:org/springframework/oxm/schema.xsd"/>
    </bean>
    ...

</beans>]]></programlisting>
			<section id="oxm-jaxb2-xsd">
	        	<title>XML Schema-based Configuration</title>
	        	<para>
	        		The <literal>jaxb2-marshaller</literal> tag configures a <classname>org.springframework.oxm.jaxb.Jaxb2Marshaller</classname>.
	        		Here is an example:
	        	</para>
390
	        	<programlisting language="xml"><![CDATA[<oxm:jaxb2-marshaller id="marshaller" contextPath="org.springframework.ws.samples.airline.schema"/>]]></programlisting>
391 392 393
	        	<para>
	        		Alternatively, the list of classes to bind can be provided to the marshaller via the <literal>class-to-be-bound</literal> child tag:
	        	</para>
394
	        	<programlisting language="xml"><![CDATA[<oxm:jaxb2-marshaller id="marshaller">
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
    <oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Airport"/>
    <oxm:class-to-be-bound name="org.springframework.ws.samples.airline.schema.Flight"/>
    ...
</oxm:jaxb2-marshaller>
	        	]]></programlisting>
	        	<para>
	        		Available attributes are:
                    <informaltable>
                        <tgroup cols="3">
                        	<colspec colwidth="1.5*"/>
                        	<colspec colwidth="4*"/>
                        	<colspec colwidth="1*"/>
                            <thead>
                                <row>
                                    <entry>Attribute</entry>
                                    <entry>Description</entry>
                                    <entry>Required</entry>
                                </row>
                            </thead>
                            <tbody>
                                <row>
                                    <entry><literal>id</literal></entry>
                                    <entry>the id of the marshaller</entry>
                                    <entry>no</entry>
                                </row>
                                <row>
                                    <entry><literal>contextPath</literal></entry>
                                    <entry>the JAXB Context path</entry>
                                    <entry>no</entry>
                                </row>
                            </tbody>
                        </tgroup>
                    </informaltable>
	        	</para>
	        </section>
        </section>
    </section>
    <section id="oxm-castor">
        <title>Castor</title>
        <para>
            Castor XML mapping is an open source XML binding framework. It allows you to transform the data contained in
            a java object model into/from an XML document. By default, it does not require any further configuration,
            though a mapping file can be used to have more control over the behavior of Castor.
        </para>
        <para>
            For more information on Castor, refer to the <ulink url="http://castor.org/xml-framework.html">
            <citetitle>Castor web site</citetitle></ulink>. The Spring integration classes reside in the
            <package>org.springframework.oxm.castor</package> package.
        </para>
        <section>
            <title>CastorMarshaller</title>
            <para>
                As with JAXB, the <classname>CastorMarshaller</classname> implements both the 
                <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename> interface. 
                It can be wired up as follows:
            </para>
451
            <programlisting language="xml"><![CDATA[
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
<beans>

    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" />
    ...

</beans>]]></programlisting>
        </section>
        <section>
            <title>Mapping</title>
            <para>
                Although it is possible to rely on Castor's default marshalling behavior, it might be necessary to have
                more control over it. This can be accomplished using a Castor mapping file. For more information, refer
                to <ulink url="http://castor.org/xml-mapping.html">Castor XML Mapping</ulink>.
            </para>
            <para>
                The mapping can be set using the <property>mappingLocation</property> resource property, indicated
                below with a classpath resource.
            </para>
470
            <programlisting language="xml"><![CDATA[
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
<beans>
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller" >
        <property name="mappingLocation" value="classpath:mapping.xml" />
    </bean>
</beans>
]]></programlisting>
        </section>
    </section>

    <section id="oxm-xmlbeans">
        <title>XMLBeans</title>
        <para>
            XMLBeans is an XML binding tool that has full XML Schema support, and offers full XML Infoset
            fidelity. It takes a different approach to that of most other O/X mapping frameworks, in that
            all classes that are generated from an XML Schema are all derived from
            <interfacename>XmlObject</interfacename>, and contain XML binding information in them.
        </para>
        <para>
            For more information on XMLBeans, refer to the <ulink url="http://xmlbeans.apache.org/">
			   <citetitle>XMLBeans web site </citetitle></ulink>. The Spring-WS integration classes reside
            in the <package>org.springframework.oxm.xmlbeans</package> package.
        </para>
        <section>
            <title>XmlBeansMarshaller</title>
            <para>
                The <classname>XmlBeansMarshaller</classname>
                implements both the <interfacename>Marshaller</interfacename>
                and <interfacename>Unmarshaller</interfacename>
                interfaces. It can be configured as follows:
            </para>
501
            <programlisting language="xml"><![CDATA[
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
<beans>

    <bean id="xmlBeansMarshaller" class="org.springframework.oxm.xmlbeans.XmlBeansMarshaller" />
    ...

</beans>]]></programlisting>
            <note>
                <para>
                    Note that the <classname>XmlBeansMarshaller</classname>
                    can only marshal objects of type <interfacename>XmlObject</interfacename>,
                    and not every <classname>java.lang.Object</classname>.
                </para>
            </note>
			<section id="oxm-xmlbeans-xsd">
	        	<title>XML Schema-based Configuration</title>
	        	<para>
	        		The <literal>xmlbeans-marshaller</literal> tag configures a <classname>org.springframework.oxm.xmlbeans.XmlBeansMarshaller</classname>.
	        		Here is an example:
	        	</para>
521
	        	<programlisting language="xml"><![CDATA[<oxm:xmlbeans-marshaller id="marshaller"/>]]></programlisting>
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
	        	<para>
	        		Available attributes are:
                    <informaltable>
                        <tgroup cols="3">
                        	<colspec colwidth="1.5*"/>
                        	<colspec colwidth="4*"/>
                        	<colspec colwidth="1*"/>
                            <thead>
                                <row>
                                    <entry>Attribute</entry>
                                    <entry>Description</entry>
                                    <entry>Required</entry>
                                </row>
                            </thead>
                            <tbody>
                                <row>
                                    <entry><literal>id</literal></entry>
                                    <entry>the id of the marshaller</entry>
                                    <entry>no</entry>
                                </row>
                                <row>
                                    <entry><literal>options</literal></entry>
                                    <entry>the bean name of the XmlOptions that is to be used for this marshaller. Typically a
                                    <classname>XmlOptionsFactoryBean</classname> definition</entry>
                                    <entry>no</entry>
                                </row>
                            </tbody>
                        </tgroup>
                    </informaltable>
	        	</para>
	        </section>            
        </section>


    </section>

    <section id="oxm-jibx">
        <title>JiBX</title>
        <para>
            The JiBX framework offers a solution similar to that which JDO provides for ORM: a binding definition defines the
            rules for how your Java objects are converted to or from XML. After preparing the binding and compiling the
            classes, a JiBX binding compiler enhances the class files, and adds code to handle converting instances of
            the classes from or to XML.
        </para>
        <para>
            For more information on JiBX, refer to the <ulink url="http://jibx.sourceforge.net/">
            <citetitle>JiBX web site</citetitle></ulink>. The Spring integration classes reside in the
            <package>org.springframework.oxm.jibx</package> package.
        </para>
        <section>
            <title>JibxMarshaller</title>
            <para>
                The <classname>JibxMarshaller</classname> class implements both the 
                <interfacename>Marshaller</interfacename> and <interfacename>Unmarshaller</interfacename> interface.
C
Chris Beams 已提交
576
                To operate, it requires the name of the class to marshal in, which you can set using the
577 578 579 580
                <property>targetClass</property> property. Optionally, you can set the binding name using the
                <property>bindingName</property> property. In the next sample, we bind the 
                <classname>Flights</classname> class:
            </para>
581
            <programlisting language="xml"><![CDATA[
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
<beans>

    <bean id="jibxFlightsMarshaller" class="org.springframework.oxm.jibx.JibxMarshaller">
        <property name="targetClass">org.springframework.oxm.jibx.Flights</property>
    </bean>

    ...
]]></programlisting>
            <para>
                A <classname>JibxMarshaller</classname> is configured for a single class. If you want to marshal
                multiple classes, you have to configure multiple <classname>JibxMarshaller</classname>s with
                different <property>targetClass</property> property values.
            </para>
			<section id="oxm-jibx-xsd">
	        	<title>XML Schema-based Configuration</title>
	        	<para>
	        		The <literal>jibx-marshaller</literal> tag configures a <classname>org.springframework.oxm.jibx.JibxMarshaller</classname>.
	        		Here is an example:
	        	</para>
601
	        	<programlisting language="xml"><![CDATA[<oxm:jibx-marshaller id="marshaller" target-class="org.springframework.ws.samples.airline.schema.Flight"/>]]></programlisting>
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
	        	<para>
	        		Available attributes are:
                    <informaltable>
                        <tgroup cols="3">
                        	<colspec colwidth="1.5*"/>
                        	<colspec colwidth="4*"/>
                        	<colspec colwidth="1*"/>
                            <thead>
                                <row>
                                    <entry>Attribute</entry>
                                    <entry>Description</entry>
                                    <entry>Required</entry>
                                </row>
                            </thead>
                            <tbody>
                                <row>
                                    <entry><literal>id</literal></entry>
                                    <entry>the id of the marshaller</entry>
                                    <entry>no</entry>
                                </row>
                                <row>
                                    <entry><literal>target-class</literal></entry>
                                    <entry>the target class for this marshaller</entry>
                                    <entry>yes</entry>
                                </row>
                                <row>
                                    <entry><literal>bindingName</literal></entry>
                                    <entry>the binding name used by this marshaller</entry>
                                    <entry>no</entry>
                                </row>
                            </tbody>
                        </tgroup>
                    </informaltable>
	        	</para>
	        </section>            
        </section>
    </section>
    <section id="oxm-xstream">
        <title>XStream</title>
        <para>
            XStream is a simple library to serialize objects to XML and back again. It does not require any mapping, and
            generates clean XML.
        </para>
        <para>
            For more information on XStream, refer to the <ulink url="http://xstream.codehaus.org/">
			<citetitle>XStream web site</citetitle></ulink>. The Spring integration classes reside in the
            <package>org.springframework.oxm.xstream</package> package.
        </para>
        <section>
            <title>XStreamMarshaller</title>
            <para>
                The <classname>XStreamMarshaller</classname> does not require any configuration, and can be configured
                in an application context directly. To further customize the XML, you can set an 
                <emphasis>alias map</emphasis>, which consists of string aliases mapped to classes:
            </para>
657
            <programlisting language="xml"><![CDATA[
658 659 660 661 662 663 664 665 666 667 668 669
<beans>

    <bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
        <property name="aliases">
            <props>
                <prop key="Flight">org.springframework.oxm.xstream.Flight</prop>
            </props>
        </property>
    </bean>
    ...

</beans>]]></programlisting>
A
Docs  
Arjen Poutsma 已提交
670
            <warning>
671
                <para>
A
Docs  
Arjen Poutsma 已提交
672 673 674 675 676 677 678 679 680
                  By default, XStream allows for arbitrary classes to be unmarshalled, which can result in security
                  vulnerabilities.
                  As such, it is recommended to set the <property>supportedClasses</property> property on the
                  <classname>XStreamMarshaller</classname>, like so:
                  <programlisting language="xml"><![CDATA[<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="supportedClasses" value="org.springframework.oxm.xstream.Flight"/>
    ...
</bean>]]></programlisting>
                  This will make sure that only the registered classes are eligible for unmarshalling.
681
                </para>
A
Docs  
Arjen Poutsma 已提交
682 683 684 685 686 687 688 689 690 691 692
                <para>
                  Additionally, you can register <ulink url="http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/oxm/xstream/XStreamMarshaller.html#setConverters(com.thoughtworks.xstream.converters.ConverterMatcher[])">
                  custom converters</ulink> to make sure that only your supported classes can be unmarshalled.
                </para>
            </warning>
          <note>
              <para>
                  Note that XStream is an XML serialization library, not a data binding library. Therefore, it has
                  limited namespace support. As such, it is rather unsuitable for usage within Web services.
              </para>
          </note>
693 694 695
        </section>
    </section>
</chapter>