我有一个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 {
.....
}
答案 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信息,@Header
与AbstractWebServiceInboundGateway
进行协商,并将DefaultSoapHeaderMapper
状态提取为单独的source.getSoapHeader()
。因此,您仍然可以从请求中访问所需的标头。