Spring学习笔记25

 

Spring-WS集成

       是时候进入开发Spring-WS服务的最后阶段了,需要完成的工作包括配置Spring应用context和端点bean以及一组Spring-WS所需的基础bean

       Spring-WS是基于Spring MVC的。在Spring MVC中所有的请求都由DispatcherServlet处理。它负责分发那些被传递到处理请求的控制器的请求。Spring-WS提供了MessageDispatchrServlet,它是DispatcherServlet的子类,负责分发到Spring-WS端点的SOAP请求。MessageDispatchrServletweb.xml文件中配置:

<servlet>

    <servlet-name>poker</servlet-name>

    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>poker</servlet-name>

    <url-pattern>/services/*</url-pattern>

</servlet-mapping>

Spring-WS的前端你只需要配置MessageDispatcherServlet。除此之外,我们还需要配置一组bean

1.      Spring-WS:概览

在配置那些bean之前,先看看它们是什么样的以及之间的相关关系。如图:


下面分别进行解释:

       ·payloadMapping:映射XML消息到一个合适的端点。本例将使用一个mapping来根据XML消息的根节点查询端点。

       ·evaluateHandEndpoint:处理接收的XML消息的端点。

       ·marshallerevaluateHandEndpoint可以将XML消息作为DOMJDOM元素,或SAX事件handler来处理。相反,marshaller bean会自动地将XML转化为Java对象。

       ·pokerHandEvaluator:一个POJO,执行真正的poker hand处理服务,由evaluateHandEndpoint调用。

       ·endpointExceptionResolverSpring-WS bean,处理请求时会自动地转化Java异常为对应的SOAP错误。

       ·poker:为web service提供WSDL,可以手工创建也可以从消息的XSD中自动生成。

下面就分别来看看这些配置,先从消息处理适配器(message handler adapter)开始。

2.      映射消息到端点

客户发送消息时,MessageDispatcherServlet如何知道哪个端点应该处理该消息呢?即使我们只创建一个端点,MessageDispatcherServlet还是有可能被配置多个端点。因此我们需要能够映射消息到相应的端点上。

MessageDispatcherServlet使用端点映射机制来确定哪些端点应该接收到来的XML消息。对于poker hand服务来说,我们可以使用Spring-WS提供的PayloadRootQNameEndpointMapping,例如:

<bean id="payloadMapping"

    class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">

    <property name="endpintMap">

       <map>

           <entry key="{http://www.springinaction.com/poker/schemas}EvaluateHandRequest"

              value-ref="evaluateHandEndpoint" />

       </map>

    </property>

</bean>

       PayloadRootQNameEndpointMapping映射SOAP消息的方法是检查消息payloadQName并从端点映射列表(通过endpointMap属性配置)中查询出适合的端点然后映射之。

       在这个例子中,消息的根节点元素是<EvaluateHandRequest>,并带有一个命名空间URIhttp://www.springinaction.com/poker/schemas,因此QName就是{http://www.springinaction.com/poker/schemas} EvaluateHandRequest。我们将此QName映射到一个名为evaluateHandEndpointbean上,而evaluateHandEndpoint就是我们前面创建的端点的实现。

3.      绑定服务端点

我们现在需要绑定这个端点。如果你使用基于JDOM的端点,配置方法如下:

<bean id="evaluateHandEndpoint"

    class="com.springinaction.poker.webservice.EvaluateHandJDomEndpoint">

    <property name="pokerHandEvaluator" ref="pokerHandEvaluator" />

</bean>

我们只需要配置一个属性,即pokerHandEvaluatorEvaluateHandEndpoint不会执行真正的服务操作,它只是委托给PokerHandEvaluator的一个实现来完成。所以,pokerHandEvaluator bean应当如此配置:

<bean id="pokerHandEvaluator"

    class="com.springinaction.poker.PokerHandEvaluatorImpl" />

如果你使用的是EvaluateHandMarshallingEndpoint,那么你就需要如下配置:

<bean id="evaluateHandEndpoint"

    class="com.springinaction.poker.webservice.EvaluateHandMarshallingEndpoint">

    <property name="marshaller" ref="marshaller" />

    <property name="unmarshaller" ref="marshaller" />

    <property name="pokerHandEvaluator" ref="pokerHandEvaluator" />

</bean>

值得注意的是,pokerHandEvaluator属性引用了一个PokerHandEvaluatorImpl对象。但是marshaling端点还需要配置marshallerunmarshaller属性,这里我们都引用了相同的marshaller bean

4.      配置消息marshaler

实现对象和XML消息转换的关键在于OXM(object-XML mapping)Spring-OXM作为Spring-WS的一个子项目在通用的OXM解决方案(JAXBCastor XML)之上提供了一层抽象层。

Spring OXM核心元素是MarshallerUnmarshaller接口。实现Marshaller接口可以实现从Java对象到XML消息的转换;实现Unmarshaller接口可实现从XML消息到java对象的转换。AbstractMarshallingPayloadEndpoint即发挥了它们的优势。当AbstractMarshallingPayloadEndpoint接收到一条消息时,它会将消息传递给Unmarshaller来转化XML消息到java对象,并将此对象传递个invokeInternal方法。当invokeInternal方法完成后,返回的对象被传递给Marshaller将对象转换成XML消息并返回给客户。

你不需要自己实现MarshallerUnmarshallerSpring-OXM提供了一些具体的实现,如CastorMarshallerJaxb1Marshaller等。它们同时实现了MarshallerUnMarshaller接口,从而可以提供一应俱全的功能。

你可以任意选择这些实现类,但是对Xstream而言,它是有条件地支持XML命名空间的,因为XML命名空间对于定义web service类型时必须得,所以Xstream不适用于web service,但却适用于XML序列化。

对于poker hand evaluator服务而言,我们选择使用Castor XML,配置文件如下:

<bean id="marshaller"

    class="org.springframework.oxm.castor.CastorMarshaller">

    <property name="mappingLocation"

       value="classpath:mapping.xml" />

</bean>

不用任何配置Castor XML即可完成一些基本的XML marshaling,但是为了完成更复杂的工作,我们需要使用Castor XML映射文件。mappingLocation属性即指定了该映射文件的位置。

       配置完一个端点的映射bean,端点实现beanXML marshaling bean之后,我们就完成了poker hand evaluator服务的大部分工作,但还存在着一些bean可以让这个web service更加完整。为使我们的web service更加健壮,我们要声明一个映射Java异常到SOAP错误的bean

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值