Spring WS和JAXB - 配置SOAPMessageDispatcher,DefaultMethodEndpointAdapter和MarshallingPayloadMethodProcessor

zig*_*ggy 9 java spring soap spring-ws java-ee

使用Spring-WS时,配置非常小,因为我一直在使用注释.最近我一直试图测试如何在SOAP响应中包含附件并使其工作我最终得到了以下配置.

<bean id="messageReceiver"
    class="org.springframework.ws.soap.server.SoapMessageDispatcher">
    <property name="endpointAdapters">
        <list>
            <ref bean="defaultMethodEndpointAdapter" />
        </list>
    </property>
</bean> 

<bean id="defaultMethodEndpointAdapter"
    class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
    <property name="methodArgumentResolvers">
        <list>
            <!-- Be careful here! You might need to add more processors if you do 
                more than webservices! -->
            <ref bean="marshallingPayloadMethodProcessor" />
        </list>
    </property>
    <property name="methodReturnValueHandlers">
        <list>
            <ref bean="marshallingPayloadMethodProcessor" />
        </list>
    </property>
</bean>     

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.mypackage.ws" />
    <property name="mtomEnabled" value="true" />
</bean>

<bean id="marshallingPayloadMethodProcessor"
    class="org.springframework.ws.server.endpoint.adapter.method.MarshallingPayloadMethodProcessor">
    <constructor-arg ref="marshaller" />
    <constructor-arg ref="marshaller" />
</bean> 
Run Code Online (Sandbox Code Playgroud)

通过上面的内容,我可以生成带附件的SOAP响应.问题是我真的不明白发生了什么.(即上述配置是做什么的,可以启用MTOM附件.

要启用附件:

  • 为什么我需要配置JAXB marshaller?没有此配置,所有不使用附件的Web服务都可以正常工作.我所要做的就是使用@EndPoint注释.非附件Web服务的请求/响应对象也是基于JAXB的,所以这表明我可能没有做到这一点(即使它有效).

  • 上面配置中显示的messageReceiver和defaultmethodEndpointAdapter bean的用途是什么?没有这些,非附件端点工作正常.

  • 最后是否可以注释上述任何配置而不是XML?我注意到JAX-WS有一个@MTOM注释但是找不到Spring-WS的等价物

即使服务工作正如我所期望的那样,我有点担心配置可能不正确.我想理解为什么这些是必需的,因此我可以更好地决定我所做的是对还是错.

提前致谢

int*_*21h 4

如果您不自己创建这些 bean,Spring 会自动为您创建这些 bean。这就是为什么你以前不需要这样做。

要启用 mtom,请在编组器上设置 mtomEnabled = true。由于您自己创建了编组器,因此您必须专门创建依赖于它的 bean,否则 Spring 不会知道它。

我不能 100% 确定 MarshallingPayloadMethodProcessor 是否是默认创建的,而无需您自己定义,但我 100% 确定 DefaultMethodEndpointAdapter 是。

DefaultMethodEndpointAdapter 的工作只是映射您的端点,它能够执行一些任务,例如在调用端点之前委托给参数处理程序,以及从中获取返回值并将其转换为 mtom 消息。这就是 MarshallingPayloadMethodProcessor 的作用。

上面也可以注释。查看位于此处的 Spring WS mtom 示例:https://github.com/spring-projects/spring-ws-samples/tree/master/mtom

总而言之,您必须创建所有额外的 beans 的原因是因为您自定义了编组器。既然您这样做了,您还必须创建任何依赖于它的 bean,并传入依赖项(除非它使用 Spring 将按照约定查找的 bean 名称(如 messageSource)。