【问题标题】:Spring WS and JAXB - Configuring SOAPMessageDispatcher, DefaultMethodEndpointAdapter and MarshallingPayloadMethodProcessorSpring WS 和 JAXB - 配置 SOAPMessageDispatcher、DefaultMethodEndpointAdapter 和 MarshallingPayloadMethodProcessor
【发布时间】:2012-07-08 04:03:47
【问题描述】:

使用 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 的等效项

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

提前致谢

【问题讨论】:

  • 好问题。有时我会觉得,为了让事情变得更简单,软件(如 Spring)变得复杂了。
  • @ziggy 我在使用 Spring Boot 编写客户端以读取 MTOM 附件时遇到问题。我尝试了您提到的选项,但没有运气。你能不能给点意见我错过了什么。stackoverflow.com/questions/53550919/…

标签: java spring jakarta-ee soap spring-ws


【解决方案1】:

Spring 变得如此庞大,以至于我们很难获得所有问题的正确信息。我主要面临 messageReceiver 的问题,我们在其中为 SoapMessageDispatcher 创建 bean。例子

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;
}

【讨论】:

    【解决方案2】:

    如果您不自己做,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)。

    【讨论】:

    • 废话我没有意识到这篇文章这么老了。对不起。
    • 我注意到必须使用该名称创建“messageReceiver”bean,否则它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多