From 3c03f53d2dcebb8841981308eeeb60cfdb896336 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Mon, 23 Apr 2007 13:10:15 +0000 Subject: [PATCH] Lotsa docs. --- src/docbkx/client.xml | 8 +- src/docbkx/common.xml | 158 +++++++++++++++ src/docbkx/index.xml | 56 +++++- src/docbkx/overview.xml | 142 ------------- src/docbkx/resources/images/spring-deps.png | Bin 0 -> 27666 bytes src/docbkx/server.xml | 153 +------------- src/docbkx/tutorial.xml | 36 +++- src/docbkx/what-is-spring-ws.xml | 144 +++++++++++++ src/docbkx/why-contract-first.xml | 212 ++++++++++++++++++++ 9 files changed, 592 insertions(+), 317 deletions(-) create mode 100644 src/docbkx/common.xml delete mode 100644 src/docbkx/overview.xml create mode 100644 src/docbkx/resources/images/spring-deps.png create mode 100644 src/docbkx/what-is-spring-ws.xml create mode 100644 src/docbkx/why-contract-first.xml diff --git a/src/docbkx/client.xml b/src/docbkx/client.xml index 2950b89f..218686ac 100644 --- a/src/docbkx/client.xml +++ b/src/docbkx/client.xml @@ -53,7 +53,8 @@ In addition to a message sender, the WebServiceTemplate requires a Web service message factory. As explained in , there are two message factories for SOAP: SaajSoapMessageFactory and - AxiomSoapMessageFactory. + AxiomSoapMessageFactory. If no message factory is specified, Spring-WS will + use the SaajSoapMessageFactory by default. @@ -102,9 +103,6 @@ public class WebServiceClient { - - - @@ -116,7 +114,7 @@ public class WebServiceClient { This example uses the template to send a hello world message to the web service located at http://localhost:8080/WebService, and writes the result to the console. - The WebServiceTemplate is injected with the message factory and sender. + The WebServiceTemplate is injected with the message sender. A zero argument constructor and messageFactory / messageSender bean properties are provided and can be used for constructing the instance (using a BeanFactory or plain Java code). Alternatively, consider deriving from diff --git a/src/docbkx/common.xml b/src/docbkx/common.xml new file mode 100644 index 00000000..8529b9d2 --- /dev/null +++ b/src/docbkx/common.xml @@ -0,0 +1,158 @@ + + + + Shared components + + In this chapter, we will explore the the components which are shared between client- and server side + Spring-WS development. These interfaces and classes represent the building blocks of Spring-WS, so + it's important to understand what they do, even if you do not use them directly. + +
+ Web service messages +
+ <interfacename>WebServiceMessage</interfacename> + + One of the core interfaces within Spring Web Services is the + WebServiceMessage. This interface represents a protocol agnostic XML + message. The interface contains methods that provide access to the payload of the message, in the form + of a javax.xml.transform.Source or a + javax.xml.transform.Result. Source and + Result are tagging interfaces that represent an abstraction over XML + input and output. Concrete implementations wrap various XML representations, as indicated in the table + below. + + + + + Source/Result implementation + Wraps XML representation + + + + + + javax.xml.transform.dom.DOMSource + + + org.w3c.dom.Node + + + + + javax.xml.transform.dom.DOMResult + + + org.w3c.dom.Node + + + + + javax.xml.transform.sax.SAXSource + + + org.xml.sax.InputSource + and + org.xml.sax.XMLReader + + + + + javax.xml.transform.sax.SAXResult + + + org.xml.sax.ContentHandler + + + + + javax.xml.transform.stream.StreamSource + + + java.io.File, java.io.InputStream, or + java.io.Reader + + + + + javax.xml.transform.stream.StreamResult + + + java.io.File, java.io.OutputStream, or + java.io.Writer + + + + + + In addition to reading from and writing to the payload, a Web service message can write itself to an + output stream. + +
+
+ <interfacename>SoapMessage</interfacename> + + The SoapMessage is an extension of + WebServiceMessage. It contains SOAP-specific methods, such as getting + SOAP Headers, SOAP Faults, etc. Generally, your code should only not be dependent on + SoapMessage, because the content of the SOAP Body can be obtained via + getPayloadSource() and getPayloadResult() in the + WebServiceMessage. Only when it is necessary to perform SOAP-specific + actions, such as adding a header, get an attachment, etc., should you need to cast + WebServiceMessage to SoapMessage. + +
+
+ Message Factories + + Concrete message implementation are created by a + WebServiceMessageFactory. This factory can create an empty message, or + read a message based on an input stream. + There are two concrete implementations of WebServiceMessageFactory. + One is based on SAAJ, the SOAP with Attachments API for Java, the other based on Axis 2's AXIOM, the + AXis Object Model. + +
+ <classname>SaajSoapMessageFactory</classname> + + The SaajSoapMessageFactory uses the SOAP with Attachments API for Java to + create SoapMessage implementations. SAAJ is part of J2EE 1.4, so it should be + supported under most modern application servers. You wire up a + SaajSoapMessageFactory like so: + ]]> + + + + SAAJ is based on DOM, the Document Object Model. This means that all SOAP messages are + stored in memory as a whole. For larger SOAP messages, this may not be very performant. + In that case, the AxiomSoapMessageFactory might be more applicable. + + +
+
+ <classname>AxiomSoapMessageFactory</classname> + + The AxiomSoapMessageFactory uses the AXis 2 Object Model to create + SoapMessage implementations. AXIOM is based on StAX, the Streaming + API for XML. StAX provides a pull-based mechanism for reading XML messages, which can be more + efficient for larger messages. + + + To increase reading performance on the AxiomSoapMessageFactory, + you can set the payloadCaching property to false (default is true). + This this will read the contents of the SOAP body directly from the stream. + When this setting is enabled, the payload can only be read once. + This means that you have to make sure that any preprocessing of the message does not consume it. + + + You use the AxiomSoapMessageFactory as follows: + + +]]> + +
+
+
+
\ No newline at end of file diff --git a/src/docbkx/index.xml b/src/docbkx/index.xml index 268fc76c..004830bd 100644 --- a/src/docbkx/index.xml +++ b/src/docbkx/index.xml @@ -32,15 +32,51 @@ - - - Document-driven Web services with Spring-WS - This chapter will contain the reference for server-side Spring-WS usage. - - - - - - + + Introduction + + + This first part of the reference documentation gives an overview of Spring Web Services, and the + underlying concepts. We will introduce Spring-WS, and explain the concepts behind contract-first + Web service development. + + + + + + + + Reference + + + This part of the reference documentation gives an in-depth look into the various pieces that make up + Spring Web Services. + It consists of a chapter which discusses the parts common to both client- and server-side, a chapter + about writing server-side Web services, about using Web services on the client-side, using WS-Security, + and the flexible Object/XML mapping. + + + + + + Document-driven Web services with Spring-WS + This chapter will contain the reference for server-side Spring-WS usage. + + + + + + + + Other Resources + + + In addition to this reference documentation, a number of other resources + exist to help you learn how to use Spring Web Services. These resources are + discussed in this section. + + + + diff --git a/src/docbkx/overview.xml b/src/docbkx/overview.xml deleted file mode 100644 index e551c502..00000000 --- a/src/docbkx/overview.xml +++ /dev/null @@ -1,142 +0,0 @@ - - - - Introduction - -
- Overview - - Spring-WS consists of three separate modules. This chapter discusses each of the modules in turn. - - - The Core package is the central part of the Web services functionality. It - provides the central WebServiceMessage and SoapMessage - interfaces, the powerful message dispatching, and the various support classes for implementing Web service - endpoints. - - - The Security package 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 - authentication and authorization. - - - The OXM package 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. - -
- - -
- Why Spring Web Services? - - There are various other SOAP stacks available, why and where should you use Spring-WS? This section answers - that question by showing what the focus of Spring-WS is. - -
- Spring-WS is meant for Public Web Services - - One can distinguish between two different sorts of Web services. Private Web services are not used - outside your application domain. They might form a part of your Enterprise Service Bus, or used as a - means to communicate between a fat .NET client and a J2EE server. When the two sides of the spectrum - (client and server) are under your control, you can easily expose (existing) methods, since you can - (re)generate client code easily. - - - Public Web services provide a separate interface to your application. They are often used by clients - that are outside of your reach. When developing a public Web service, you should really think about the - interface you are providing: it is probably going to be around for a while, and you cannot change it - that often. As such, it is a good idea to place the Web service in a separate layer, thus hiding the - inner workings of the application. As a result, you can change the Web service and the rest of the - appliciation seperately. - -
-
- Spring-WS makes Web Services First Class Citizens of the Architecture - - Web Services deserve a proper place in an application architecture. Often, they exist as an afterthought - in the application architecture, mostly because existing Java business interfaces are exposed as SOAP - services. One could say that they are "SOAPified". Spring-WS provides a MVC-like framework for - developing a Web service application layer, just like you would develop a layer especially for a Web - user interface using Spring-MVC. Spring-WS also provides useful integration points with you existing - Spring application architecture, such as the Acegi integration. - -
-
- Spring-WS is Data-Driven - - When Web Services started making their way into the Enterprise Computing world, developers considered - Web Services just another, XML-based remoting protocol. Such remoting frameworks can be used with - relative ease: on the server-side, one simply implements a specific interface such as - java.rmi.Remote, and on the client side, a dynamic proxy is used. - Unfortunately, because of this simplicity, remoting architectures have some issues: - - - - They pretend there is no latency between the client and the server, - while in fact there is both network and application latency, - - - - - They pretend that client and server have shared memory access, while in - fact data must be both marshalled and unmarshalled, - - - - - They ignore the possibility of a request or response not reaching its - destination, - - - - - They enforce a non-concurrent programming model, while in fact a - concurrent approach seems more in place, - - - - - They enforce a tightly coupled architecture, where changes on the - server-side result in changes on the client-side. - - - - It is not without reason that Gregor Hohpe calls a distributed architecture a fairy tale - architecture: one is made to believe things that simply are not true. To quote : -
- - Objects that interact in a distributed system need to be dealt with in ways that are - intrinsically different from objects that interact in a single address space. - -
-
- - Instead of being behavior-driven, Spring-WS is data-driven: it focusses on the data being sent, not on a - particular method being invoked. - -
-
- Spring-WS Focusses on Contract-first Development - - SOAP services are defined in two contracts: the data contract (the XSD schema), and the service contract - (the WSDL). Generating these contracts from Java-code is called contract-last - development identifies some problems with this approach, most - importantly: -
- - There is no way to ensure that a service’s published interface remains constant over time. - Every redeployment of the service may change the classes, and hence the contract. - -
- The alternative of contract-last development is contract-first development. - Using this approach, the service and data contract are leading. Spring-WS focusses on contract-first Web - service development, because is considered to be a best practice. After all, the actual XML that is sent - across the wire is more important than the Java code that is used to implement it. -
-
-
-
diff --git a/src/docbkx/resources/images/spring-deps.png b/src/docbkx/resources/images/spring-deps.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf08e2198d88b6a936799fcaa1f068a8b43cffd GIT binary patch literal 27666 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 B^~eAK literal 0 HcmV?d00001 diff --git a/src/docbkx/server.xml b/src/docbkx/server.xml index 953c2bcc..d27a7864 100644 --- a/src/docbkx/server.xml +++ b/src/docbkx/server.xml @@ -1,157 +1,8 @@ - - Creating a Web service with Spring-WS -
- Web service messages -
- - <interfacename>WebServiceMessage</interfacename> and <interfacename>SoapMessage</interfacename> - - - One of the core interfaces within Spring Web Services is the - WebServiceMessage. This interface represents a protocol agnostic XML - message. The interface contains methods that provide access to the payload of the message, in the form - of a javax.xml.transform.Source or a - javax.xml.transform.Result. Source and - Result are tagging interfaces that represent an abstraction over XML - input and output. Concrete implementations wrap various XML representations, as indicated in the table - below. - - - - - Source/Result implementation - Wraps XML representation - - - - - - javax.xml.transform.dom.DOMSource - - - org.w3c.dom.Node - - - - - javax.xml.transform.dom.DOMResult - - - org.w3c.dom.Node - - - - - javax.xml.transform.sax.SAXSource - - - org.xml.sax.InputSource - and - org.xml.sax.XMLReader - - - - - javax.xml.transform.sax.SAXResult - - - org.xml.sax.ContentHandler - - - - - javax.xml.transform.stream.StreamSource - - - java.io.File, java.io.InputStream, or - java.io.Reader - - - - - javax.xml.transform.stream.StreamResult - - - java.io.File, java.io.OutputStream, or - java.io.Writer - - - - - - In addition to reading from and writing to the payload, a Web service message can write itself to an - output stream. - - - The SoapMessage is an extension of - WebServiceMessage. It contains SOAP-specific methods, such as getting - SOAP Headers, SOAP Faults, etc. Generally, your code should only not be dependent on - SoapMessage, because the content of the SOAP Body can be obtained via - getPayloadSource() and getPayloadResult() in the - WebServiceMessage. Only when it is necessary to perform SOAP-specific - actions, such as adding a header, get an attachment, etc., should you need to cast - WebServiceMessage to SoapMessage. - -
-
- Message Factories - - Concrete message implementation are created by a - WebServiceMessageFactory. This factory can create an empty message, or - read a message based on an input stream. - There are two concrete implementations of WebServiceMessageFactory. - One is based on SAAJ, the SOAP with Attachments API for Java, the other based on Axis 2's AXIOM, the - AXis Object Model. - -
- <classname>SaajSoapMessageFactory</classname> - - The SaajSoapMessageFactory uses the SOAP with Attachments API for Java to - create SoapMessage implementations. SAAJ is part of J2EE 1.4, so it should be - supported under most modern application servers. You wire up a - SaajSoapMessageFactory like so: - - ]]> - - - - SAAJ is based on DOM, the Document Object Model. This means that all SOAP messages are - stored in memory as a whole. For larger SOAP messages, this may not be very performant. - In that case, the AxiomSoapMessageFactory might be more applicable. - - -
-
- <classname>AxiomSoapMessageFactory</classname> - - The AxiomSoapMessageFactory uses the AXis 2 Object Model to create - SoapMessage implementations. AXIOM uses StAX, the Streaming API for - XML. StAX provides a pull-based mechanism for reading XML messages, which can be more efficient - for larger messages. - - - To increase reading performance on the AxiomSoapMessageFactory, - you can set the payloadCaching property to false (default is true). - This this will read the contents of the SOAP body directly from the stream. - When this setting is enabled, the payload can only be read once. - This means that you have to make sure that any preprocessing of the message does not consume it. - - - You use the AxiomSoapMessageFactory as follows: - - -]]> - -
-
-
+ + Creating a Web service with Spring-WS