9

使用 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> 

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

要启用附件:

  • 为什么需要配置 JAXB 编组器?如果没有此配置,所有不使用附件的 Web 服务都可以正常工作。我所要做的就是使用@EndPoint 注释。非附件 web 服务的请求/响应对象也是基于 JAXB 的,因此这表明我可能没有正确执行此操作(即使它有效)。

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

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

尽管服务按我预期的那样工作,但我有点担心配置可能不正确。我想了解为什么需要这些,因此也许我可以更好地决定我所做的是对还是错。

提前致谢

4

2 回答 2

3

如果你不自己做,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

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

于 2014-09-30T03:05:24.667 回答
1

Spring 变得如此庞大,以至于很难为我们所有的问题获取正确的信息。我主要遇到了我们为 SoapMessageDispatcher 创建 bean 的 messageReceiver 的问题。这个例子

https://github.com/spring-projects/spring-ws-samples/tree/master/mtom

我看到该配置适用,但是当我们为端点添加 @SoapHeader 注释时,它会因“端点错误没有适配器”而失败。

我看到的唯一修复是从配置中删除 messageReceiver bean。

因此,您的配置足以调用 Web 服务。

@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setApplicationContext(context);
    servlet.setTransformWsdlLocations(true);
    return new ServletRegistrationBean(servlet, "/ws/*");
}

@Bean(name = "studentDetails")
public Wsdl11Definition studentDefinition() {
  SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
  wsdl11Definition.setWsdl(new ClassPathResource("schema/studentDetails.wsdl"));
  return wsdl11Definition;
}


@Bean
public SaajSoapMessageFactory messageFactory() {
    SaajSoapMessageFactory s = new SaajSoapMessageFactory();
    s.setSoapVersion(SoapVersion.SOAP_12);
    return s;
}
于 2018-05-29T06:47:03.620 回答