From 6c8ac54bb89632b35aa01f91b520ba2cec0ab241 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Thu, 8 Apr 2010 10:52:36 +0000 Subject: [PATCH] SWS-603 - Drop OXM chapter from ref docs --- src/docbkx/client.xml | 6 +- src/docbkx/index.xml | 6 +- src/docbkx/oxm.xml | 747 -------------------- src/docbkx/preface.xml | 5 +- src/docbkx/resources/images/spring-deps.png | Bin 17438 -> 17231 bytes src/docbkx/server.xml | 23 +- src/docbkx/tutorial.xml | 2 +- src/docbkx/what-is-spring-ws.xml | 19 +- 8 files changed, 21 insertions(+), 787 deletions(-) delete mode 100644 src/docbkx/oxm.xml diff --git a/src/docbkx/client.xml b/src/docbkx/client.xml index 04e6798d..fe416e94 100644 --- a/src/docbkx/client.xml +++ b/src/docbkx/client.xml @@ -7,7 +7,7 @@ Introduction Spring-WS provides a client-side Web service API that allows for consistent, XML-driven access to - Web services. It also caters for the use of marshallers and unmarshallers + Web services. It also caters for the use of marshallers and unmarshallers so that your service tier code can deal exclusively with Java objects. @@ -284,7 +284,9 @@ public class WebServiceClient { WebServiceTemplate class delegates the conversion of the request object to XML to a Marshaller, and the conversion of the response XML to an object to an Unmarshaller. (For more information - about marshalling and unmarshaller, refer to .) By using the + about marshalling and unmarshaller, refer to + the Spring documentation.) + By using the marshallers, your application code can focus on the business object that is being sent or received and not be concerned with the details of how it is represented as XML. In order to use the marshalling functionality, you have to set a marshaller and unmarshaller with the diff --git a/src/docbkx/index.xml b/src/docbkx/index.xml index 10589a9d..68cd73d0 100644 --- a/src/docbkx/index.xml +++ b/src/docbkx/index.xml @@ -59,16 +59,14 @@ to both client- and server-side WS, a chapter devoted to the specifics of writing server-side Web services, a chapter about using Web services on - the client-side, and chapters on using - WS-Security and - Object/XML mapping. + the client-side, and a chapters on using + WS-Security. - Other Resources diff --git a/src/docbkx/oxm.xml b/src/docbkx/oxm.xml deleted file mode 100644 index 298b65f7..00000000 --- a/src/docbkx/oxm.xml +++ /dev/null @@ -1,747 +0,0 @@ - - - - Marshalling XML using O/X Mappers - -
- Introduction - - 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. - - - Within the field of O/X mapping, a marshaller is responsible for serializing an - object (graph) to XML. In similar fashion, an unmarshaller 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. - - Some of the benefits of using Spring for your O/X mapping needs are: - - Ease of configuration - - 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. - - - - Consistent Interfaces - - Spring's O/X mapping operates through two global interfaces: the - Marshaller and Unmarshaller 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. - - - - Consistent Exception Hierarchy - - Spring provides a conversion from exceptions from the underlying O/X mapping tool to its own exception - hierarchy with the XmlMappingException as the root exception. As can be expected, - these runtime exceptions wrap the original exception so no information is lost. - - -
-
- Marshaller and Unmarshaller - - As stated in the introduction, a marshaller serializes an object to XML, and an - unmarshaller deserializes XML stream to an object. In this section, we will describe - the two Spring interfaces used for this purpose. - -
- Marshaller - - Spring abstracts all marshalling operations behind the - org.springframework.oxm.Marshaller interface, the main methods of which - is listed below. - - The Marshaller interface has one main method, which marshals the given - object to a given javax.xml.transform.Result. Result is a tagging - interface that basically represents an XML output abstraction: concrete implementations wrap various XML - representations, as indicated in the table below. - - - - - javax.xml.transform.Result implementation - Wraps XML representation - - - - - javax.xml.transform.dom.DOMResult - org.w3c.dom.Node - - - javax.xml.transform.sax.SAXResult - org.xml.sax.ContentHandler - - - javax.xml.transform.stream.StreamResult - - java.io.File, - java.io.OutputStream, or - java.io.Writer - - - - - - - - Although the marshal method accepts a plain object as its first - parameter, most Marshaller implementations cannot handle arbitrary - objects. Instead, an object class must be mapped in a mapping file, 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. - - - -
-
- Unmarshaller - - Similar to the Marshaller, there is the - org.springframework.oxm.Unmarshaller interface. - - This interface also has one method, which reads from the given - javax.xml.transform.Source (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. - - - - - javax.xml.transform.Source implementation - Wraps XML representation - - - - - javax.xml.transform.dom.DOMSource - org.w3c.dom.Node - - - javax.xml.transform.sax.SAXSource - - org.xml.sax.InputSource, and - org.xml.sax.XMLReader - - - - javax.xml.transform.stream.StreamSource - - java.io.File, - java.io.InputStream, or - java.io.Reader - - - - - - -
- - Even though there are two separate marshalling interfaces (Marshaller - and Unmarshaller), 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 applicationContext.xml. - -
- XmlMappingException - - Spring converts exceptions from the underlying O/X mapping tool to its own exception hierarchy with the - XmlMappingException as the root exception. As can be expected, these runtime - exceptions wrap the original exception so no information will be lost. - - - Additionally, the MarshallingFailureException and - UnmarshallingFailureException provide a distinction between marshalling and - unmarshalling operations, even though the underlying O/X mapping tool does not do so. - - - The O/X Mapping exception hierarchy is shown in the following figure: - - - - - - - - - - O/X Mapping exception hierarchy - - - - -
-
-
- Using Marshaller and Unmarshaller - - 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: - - - - The application class uses this bean to store its settings. Besides a main method, the class has two - methods: saveSettings saves the settings bean to a file named - settings.xml, and loadSettings loads these settings again. A - main method constructs a Spring application context, and calls these two methods. - - The Application requires both a marshaller - and unmarshaller property to be set. We can do so using the following - applicationContext.xml: - - - - - - - -]]> - 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 CastorMarshaller implements both - Marshaller and Unmarshaller, so we can refer - to the castorMarshaller bean in both the marshaller and - unmarshaller property of the application. - - - This sample application produces the following settings.xml file: - - -]]> - -
-
- XML Schema-based Configuration - - 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. - The emboldened text in the below snippet references the OXM schema: - - - - -]]> - - Currently, the following tags are available: - - - jaxb1-marshaller - - - jaxb2-marshaller - - - xmlbeans-marshaller - - - jibx-marshaller - - - - - 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: - - ]]> -
-
- JAXB - - The JAXB binding compiler translates a W3C XML Schema into one or more Java classes, a - jaxb.properties file, and possibly other files, depending on the specific - implementation of JAXB. Alternatively, JAXB2 offers a way to generate a schema from annotated Java classes. - - - Spring supports both the JAXB 1.0 and the JAXB 2.0 API as XML marshalling strategies, following the - Marshaller and Unmarshaller - interfaces described in . The corresponding integration - classes reside in the org.springframework.oxm.jaxb package. - -
- Jaxb1Marshaller - - The Jaxb1Marshaller class implements both the Spring - Marshaller and Unmarshallerinterface. It - requires a context path to operate, which you can set using the contextPath - property. The context path is a list of colon (:) separated Java package names that contain schema - derived classes. The marshaller has an additional validating property which - defines whether to validate incoming XML. - - - The next sample bean configuration shows how to configure a JaxbMarshaller - using the classes generated to org.springframework.ws.samples.airline.schema. - - - - - - - ... - -]]> -
- XML Schema-based Configuration - - The jaxb1-marshaller tag configures a org.springframework.oxm.jaxb.Jaxb1Marshaller. - Here is an example: - - ]]> - - Available attributes are: - - - - - - - - Attribute - Description - Required - - - - - id - the id of the marshaller - no - - - contextPath - the JAXB Context path - yes - - - validating - indicates whether the incoming XML should be validated - no - - - - - -
-
-
- Jaxb2Marshaller - - The Jaxb2Marshaller can be configured using the same - contextPath property as the Jaxb1Marshaller. However, it - also offers a classesToBeBound 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: - - - - - - - org.springframework.oxm.jaxb.Flight - org.springframework.oxm.jaxb.Flights - - - - - ... - -]]> -
- XML Schema-based Configuration - - The jaxb2-marshaller tag configures a org.springframework.oxm.jaxb.Jaxb2Marshaller. - Here is an example: - - ]]> - - Alternatively, the list of classes to bind can be provided to the marshaller via the class-to-be-bound child tag: - - - - - ... - - ]]> - - Available attributes are: - - - - - - - - Attribute - Description - Required - - - - - id - the id of the marshaller - no - - - contextPath - the JAXB Context path - no - - - - - -
-
-
-
- Castor - - 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. - - - For more information on Castor, refer to the - Castor web site. The Spring integration classes reside in the - org.springframework.oxm.castor package. - -
- CastorMarshaller - - As with JAXB, the CastorMarshaller implements both the - Marshaller and Unmarshaller interface. - It can be wired up as follows: - - - - - ... - -]]> -
-
- Mapping - - 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 Castor XML Mapping. - - - The mapping can be set using the mappingLocation resource property, indicated - below with a classpath resource. - - - - - - -]]> -
-
- -
- XMLBeans - - 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 - XmlObject, and contain XML binding information in them. - - - For more information on XMLBeans, refer to the - XMLBeans web site . The Spring-WS integration classes reside - in the org.springframework.oxm.xmlbeans package. - -
- XmlBeansMarshaller - - The XmlBeansMarshaller - implements both the Marshaller - and Unmarshaller - interfaces. It can be configured as follows: - - - - - ... - -]]> - - - Note that the XmlBeansMarshaller - can only marshal objects of type XmlObject, - and not every java.lang.Object. - - -
- XML Schema-based Configuration - - The xmlbeans-marshaller tag configures a org.springframework.oxm.xmlbeans.XmlBeansMarshaller. - Here is an example: - - ]]> - - Available attributes are: - - - - - - - - Attribute - Description - Required - - - - - id - the id of the marshaller - no - - - options - the bean name of the XmlOptions that is to be used for this marshaller. Typically a - XmlOptionsFactoryBean definition - no - - - - - -
-
- - -
- -
- JiBX - - 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. - - - For more information on JiBX, refer to the - JiBX web site. The Spring integration classes reside in the - org.springframework.oxm.jibx package. - -
- JibxMarshaller - - The JibxMarshaller class implements both the - Marshaller and Unmarshaller interface. - To operate, it requires the name of the class to marshall in, which you can set using the - targetClass property. Optionally, you can set the binding name using the - bindingName property. In the next sample, we bind the - Flights class: - - - - - org.springframework.oxm.jibx.Flights - - - ... -]]> - - A JibxMarshaller is configured for a single class. If you want to marshal - multiple classes, you have to configure multiple JibxMarshallers with - different targetClass property values. - -
- XML Schema-based Configuration - - The jibx-marshaller tag configures a org.springframework.oxm.jibx.JibxMarshaller. - Here is an example: - - ]]> - - Available attributes are: - - - - - - - - Attribute - Description - Required - - - - - id - the id of the marshaller - no - - - target-class - the target class for this marshaller - yes - - - bindingName - the binding name used by this marshaller - no - - - - - -
-
-
-
- XStream - - XStream is a simple library to serialize objects to XML and back again. It does not require any mapping, and - generates clean XML. - - - For more information on XStream, refer to the - XStream web site. The Spring integration classes reside in the - org.springframework.oxm.xstream package. - -
- XStreamMarshaller - - The XStreamMarshaller does not require any configuration, and can be configured - in an application context directly. To further customize the XML, you can set an - alias map, which consists of string aliases mapped to classes: - - - - - - - org.springframework.oxm.xstream.Flight - - - - ... - -]]> - - - 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. - - -
-
-
diff --git a/src/docbkx/preface.xml b/src/docbkx/preface.xml index 3400007f..5c029957 100644 --- a/src/docbkx/preface.xml +++ b/src/docbkx/preface.xml @@ -16,11 +16,10 @@ on this XML, and not on Java. - Spring Web Services focusses on creating these document-driven Web services. + Spring Web Services focuses on creating these document-driven Web services. Spring Web Services facilitates contract-first SOAP service development, allowing for the creation of flexible web services using one of the many ways to manipulate XML payloads. - Spring-WS provides a powerful message dispatching framework, various XML marshalling techniques that can be used outside a Web service environment, a message dispatching framework, a WS-Security solution that integrates with your existing application security solution, and a Client-side API that follows the familiar Spring template pattern. diff --git a/src/docbkx/resources/images/spring-deps.png b/src/docbkx/resources/images/spring-deps.png index b65bfc064d05e379e8493117ee1e9114f81ffc38..cf1caa2cc31c784cb48fb9fdda5cfb5158421cc4 100644 GIT binary patch literal 17231 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 diff --git a/src/docbkx/server.xml b/src/docbkx/server.xml index a672ab30..6dd5c938 100644 --- a/src/docbkx/server.xml +++ b/src/docbkx/server.xml @@ -24,7 +24,7 @@ Spring-WS's XML handling is extremely flexible. An endpoint can choose from a large amount of XML handling libraries supported by Spring-WS, including the DOM family (W3C DOM, JDOM, dom4j, and XOM), SAX or StAX for faster performance, XPath to extract information from the message, or even - marshalling techniques (JAXB, Castor, XMLBeans, JiBX, or XStream) to convert + marshalling techniques (JAXB, Castor, XMLBeans, JiBX, or XStream) to convert the XML to objects and vice-versa. @@ -314,18 +314,6 @@ the dispatcher servlet does not load the default adapters, and is unable to handle standard Spring-MVC Controllers. Therefore, we add the SimpleControllerHandlerAdapter at the end. - - - By default, the Spring MVC DispatcherServlet configures the following - handler adapters in version 2.5: - - org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter - org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter - org.springframework.web.servlet.mvc.throwaway.ThrowawayControllerHandlerAdapter - org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter - - - In a similar fashion, you can wire up a WsdlDefinitionHandlerAdapter to make sure @@ -669,7 +657,7 @@ public class SampleEndpoint extends AbstractDomPayloadEndpoint { Rather than handling XML directly using DOM, you can use marshalling to convert the payload of the XML message into a Java Object. Spring Web Services offers the AbstractMarshallingPayloadEndpoint for this purpose, which is built on the - marshalling abstraction described in . The + Spring's OXM package. The AbstractMarshallingPayloadEndpoint has two properties: marshaller and unmarshaller, in which you can inject in the constructor or by setters. @@ -721,7 +709,9 @@ public class MarshallingOrderEndpoint extends AbstractMarshallingPayloadEndpoint ]]><!-- Other beans, such as the endpoint mapping -->]]> - In this sample, we configure a Jaxb2Marshaller for the + In this sample, we configure a + Jaxb2Marshaller + for the OrderRequest and Order classes, and inject that marshaller together with the DefaultOrderService into our endpoint. This business service is not shown, but @@ -756,7 +746,8 @@ public class MarshallingOrderEndpoint extends AbstractMarshallingPayloadEndpoint ]]> - Instead of JAXB 2, we could have used any of the other marshallers described in . + Instead of JAXB 2, we could have used any Spring OXM marshallers. The only thing that would change in the above example is the configuration of the marshaller bean. diff --git a/src/docbkx/tutorial.xml b/src/docbkx/tutorial.xml index c307cca5..ebabaf18 100644 --- a/src/docbkx/tutorial.xml +++ b/src/docbkx/tutorial.xml @@ -620,7 +620,7 @@ public class HolidayEndpoint extends AbstractJDomPayloadEndpoint { Using JDOM is just one of the options to handle the XML: other options include DOM, dom4j, XOM, - SAX, and StAX, but also marshalling techniques like JAXB, Castor, XMLBeans, + SAX, and StAX, but also marshalling techniques like JAXB, Castor, XMLBeans, JiBX, and XStream. We chose JDOM because it gives us access to the raw XML, and because it is based on classes (not interfaces and factory methods as with W3C DOM and dom4j), which makes the code less verbose. We use XPath because it is less fragile than marshalling technologies: we don't diff --git a/src/docbkx/what-is-spring-ws.xml b/src/docbkx/what-is-spring-ws.xml index 82c48d01..b73117e3 100644 --- a/src/docbkx/what-is-spring-ws.xml +++ b/src/docbkx/what-is-spring-ws.xml @@ -79,9 +79,8 @@
Runtime environment - Spring Web Services runs within a standard Java 1.3 Runtime Environment. It also supports Java 5.0, - although the Java types which are specific to this release are packaged in a separate modules with the - suffix "tiger" in their JAR filename. Note that the security module also requires Java 5. + Spring Web Services requires a standard Java 1.5 Runtime Environment. Java 1.6 is also supported. + Spring-WS also requires Spring 3.0 or higher. Spring-WS consists of a number of modules, which are described in the remainder of this section. @@ -96,7 +95,7 @@ - The Core package (spring-ws-core.jar and spring-ws-core-tiger.jar) + The Core package (spring-ws-core.jar) is the central part of the Spring's Web services functionality. It provides the central WebServiceMessage and @@ -110,22 +109,14 @@ The Security package (spring-ws-security.jar) provides a WS-Security implementation that integrates with the core Web service package. It allows you to add principal tokens, sign, and decrypt and encrypt SOAP - messages. Addtionally, it allows you to leverage your existing Acegi security implementation for + messages. Additionally, it allows you to leverage your existing Spring Security security implementation for authentication and authorization. - - - The OXM package (spring-oxm.jar and - spring-oxm-tiger.jar) provides integration for popular XML marshalling APIs, including - JAXB 1 and 2. Using the OXM package means that you benefit from a unified exception hierarchy, and can wire - up your favorite XML marshalling technology easily. - - The following figure illustrates the Spring-WS modules and the dependencies between them. Arrows indicate - dependencies, i.e. Spring-WS Core depends on Spring-XML and Spring-OXM. + dependencies, i.e. Spring-WS Core depends on Spring-XML and the OXM module found in Spring 3.