Web Services Support
Outbound Web Service Gateways
To invoke a Web Service upon sending a message to a channel, there are two options - both of which build
upon the Spring Web Services
project: SimpleWebServiceOutboundGateway and
MarshallingWebServiceOutboundGateway. The former will accept either a
String or javax.xml.transform.Source as the message
payload. The latter provides support for any implementation of the Marshaller
and Unmarshaller interfaces. Both require a Spring Web Services
DestinationProvider for determining the URI of the Web Service to be
called. simpleGateway = new SimpleWebServiceOutboundGateway(destinationProvider);
marshallingGateway = new MarshallingWebServiceOutboundGateway(destinationProvider, marshaller);
When using the namespace support described below, you will only need to set a URI. Internally, the parser
will configure a fixed URI DestinationProvider implementation. If you do need dynamic resolution of the
URI at runtime, however, then the DestinationProvider can provide such behavior as looking up the URI from
a registry. See the Spring Web Services
javadoc for
more information about the DestinationProvider strategy.
For more detail on the inner workings, see the Spring Web Services reference guide's chapter covering
client access
as well as the chapter covering
Object/XML mapping.
Inbound Web Service Gateways
To send a message to a channel upon receiving a Web Service invocation, there are two options again: SimpleWebServiceInboundGateway and
MarshallingWebServiceInboundGateway. The former will extract a javax.xml.transform.Source
from the WebServiceMessage and set it as the message
payload. The latter provides support for implementation of the Marshaller
and Unmarshaller interfaces.
If the incoming web service message is a SOAP message the SOAP Action header will be added to the headers of the
Message that is forwarded onto the request channel.
simpleGateway = new SimpleWebServiceInboundGateway();
simpleGateway.setRequestChannel(forwardOntoThisChannel);
simpleGateway.setReplyChannel(listenForResponseHere); //Optional
marshallingGateway = new MarshallingWebServiceInboundGateway(marshaller);
//set request and optionally reply channel
Both gateways implement the Spring Web Services MessageEndpoint
interface, so they can be configured with a MessageDispatcherServlet
as per standard Spring Web Services configuration.
For more detail on how to use these components, see the Spring Web Services reference guide's chapter covering
creating a Web Service.
The chapter covering
Object/XML mapping is also applicable again.
Web Service Namespace Support
To configure an outbound Web Service Gateway, use the "outbound-gateway" element from the "ws" namespace:
]]>
Notice that this example does not provide a 'reply-channel'. If the Web Service were to
return a non-empty response, the Message containing that response would be sent to the
reply channel provided in the request Message's REPLY_CHANNEL header, and if that were
not available a channel resolution Exception would be thrown. If you want to send the
reply to another channel instead, then provide a 'reply-channel' attribute on the
'outbound-gateway' element.
When invoking a Web Service that returns an empty response after using a String payload
for the request Message, no reply Message will be sent by default.
Therefore you don't need to set a 'reply-channel' or have a REPLY_CHANNEL header in the
request Message. If for any reason you actually do want to receive
the empty response as a Message, then provide the 'ignore-empty-responses' attribute with
a value of false (this only applies for Strings, because using a
Source or Document object simply leads to a NULL response and will therefore
never generate a reply Message).
To set up an inbound Web Service Gateway, use the "inbound-gateway":
]]>
To use Spring OXM Marshallers and/or Unmarshallers, provide bean references. For outbound:
]]>
And for inbound:
]]>
Most Marshaller implementations also implement the
Unmarshaller interface. When using such a
Marshaller, only the "marshaller"
attribute is necessary. Even when using a Marshaller,
you may also provide a reference for the "request-callback" on the outbound gateways.
For either outbound gateway type, a "destination-provider" attribute can be specified instead of the "uri"
(exactly one of them is required). You can then reference any Spring Web Services DestinationProvider
implementation (e.g. to lookup the URI at runtime from a registry).
For either outbound gateway type, the "message-factory" attribute can also be configured with a reference to any
Spring Web Services WebServiceMessageFactory implementation.
For the simple inbound gateway type, the "extract-payload" attribute can be set to false to forward
the entire WebServiceMessage instead of just its payload as a
Message to the request channel. This might be useful, for example,
when a custom Transformer works against the WebServiceMessage directly.