将SoapHeader添加到Spring WS端点

时间:2016-05-10 18:11:11

标签: spring-integration spring-ws

我有一个spring ws端点作为Spring Integration项目的一部分,我想访问Soap Header。当我将SoapHeader添加到方法参数时,我得到以下异常:

  

[10/05/16 05:00:05:005 PDT] localhost-startStop-1 DEBUG   springframework.integration.util.MessagingMethodInvokerHelper.doWith():   方法[公共   com.bstonetech.ptms.integration.model.ws.external.contract.GetContractResponse   com.bstonetech.ptms.integration.service.ws.GetContractEndpoint.getContract(com.bstonetech.ptms.integration.model.ws.external.contract.GetContractRequest,org.springframework.ws.context.MessageContext)   抛出java.lang.Exception]不符合发现消息处理的条件   多个参数类型候选者:   [@ org.springframework.ws.server.endpoint.annotation.RequestPayload   com.bstonetech.ptms.integration.model.ws.external.contract.GetContractRequest]   和[org.springframework.ws.context.MessageContext]。 [16年10月5日   05:00:05:005 PDT] localhost-startStop-1 WARN   web.context.support.XmlWebApplicationContext.refresh():异常   在上下文初始化期间遇到 - 取消刷新尝试

     

java.lang.IllegalArgumentException:类型为[class]的目标对象   com.bstonetech.ptms.integration.service.ws.GetContractEndpoint]没有   处理消息的合格方法。

使用MessageContext messageContext时也会出现同样的错误。

我显然缺少一些东西。任何帮助将不胜感激。

整合如下:

   <oxm:jaxb2-marshaller id="contractMarshaller" context-path="com.bstonetech.ptms.integration.model.ws.external.contract"/>
   <ws:inbound-gateway id="getContractWs" request-channel="inboundGetContractChannel" mapped-request-headers="fileId" mapped-reply-headers="fileId"
                       marshaller="contractMarshaller" unmarshaller="contractMarshaller"/>



   <int:service-activator id="contractEndpoint" input-channel="inboundGetContractChannel" ref="getContractEndpoint"/>

端点如下所示:

@Endpoint
public class GetContractEndpoint {

   private static final String NAMESPACE_URI = "http://bstonetech.com/contract";

   @PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetContractRequest")
   @ResponsePayload
   public GetContractResponse getContract(@RequestPayload GetContractRequest request, SoapHeader soapHeader) throws Exception {
.....
}

1 个答案:

答案 0 :(得分:0)

抱歉延误。我们忙于Spring Integration 4.3.0.RC1发布: - )。

好吧,看起来你已经错过了一些东西,因此最终出现了各种担忧。

当您拥有{{1}时,Spring WS POJO方法调用注释(@RequestPayload@PayloadRoot)和特定于SOAP的参数注入实际上适用于POJO案例在服务上依赖@Endpoint或类似的Spring WS机制。

另一方面,正确的是,Spring Integration WS模块完全基于Spring WS项目,但它的目标是尽可能快地将所有内容转换为Spring Integration Messaging模型。因此,@EnableWs <ws:inbound-gateway>的结果已发送至Message。在您的情况下,根据JaxB映射,request-channel="inboundGetContractChannel"将被解组为您的某个域对象。

payload现在只能处理Messaging基础架构,它已经对SOAP一无所知。这是消息传递的一般目的,当您可以切换到完全不同的源(例如DB),但仍然使用相同的<service-activator>

要满足某些 POJO方法调用,有一些有用的注释,例如<service-activator> @Payload等。

为了保持一致并仍提供一些SOAP信息,@HeaderAbstractWebServiceInboundGateway进行协商,并将DefaultSoapHeaderMapper状态提取为单独的source.getSoapHeader()。因此,您仍然可以从请求中访问所需的标头。