我正在开发一个关于Spring Integration的POC,其中包含以下用例。
- 从远程 JMS 队列订阅输入消息 (A)
- 将输入消息 (A) 转换为 (B)
- 使用 (B) 调用远程 Web 服务并接收响应
我的 spring-int 配置 xml 有以下内容
<int-ws:outbound-gateway id="marshallingGateway" request-channel="mdmIntInputChannel" reply-channel="mdmIntOutputChannel"
uri="ws-endpoint" marshaller="marshaller" unmarshaller="marshaller"/>
<oxm:jaxb2-marshaller id="marshaller" contextPath="com.veeaar.ws.types.jaxb"/>
将我所有的 jaxb 生成的源代码放在我的 Spring 集成项目工作区中。
在 STS 3.8.3 中执行此操作时,会引发以下错误。
不确定我的代码中出了什么问题。非常感谢任何解决此问题的帮助。谢谢。
Caused by: org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException
- with linked exception:
[Exception [EclipseLink-25007] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A descriptor for class java.lang.String was not found in the project. For JAXB, if the JAXBContext was bootstrapped using TypeMappingInfo[] you must call a marshal method that accepts TypeMappingInfo as an input parameter.]
at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:908)
at org.springframework.oxm.jaxb.Jaxb2Marshaller.marshal(Jaxb2Marshaller.java:684)
at org.springframework.ws.support.MarshallingUtils.marshal(MarshallingUtils.java:81)
at org.springframework.integration.ws.MarshallingWebServiceOutboundGateway$MarshallingRequestMessageCallback.doWithMessageInternal(MarshallingWebServiceOutboundGateway.java:129)
at org.springframework.integration.ws.AbstractWebServiceOutboundGateway$RequestMessageCallback.doWithMessage(AbstractWebServiceOutboundGateway.java:233)
at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:590)
at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
at org.springframework.integration.ws.MarshallingWebServiceOutboundGateway.doHandle(MarshallingWebServiceOutboundGateway.java:87)
at org.springframework.integration.ws.AbstractWebServiceOutboundGateway.handleRequestMessage(AbstractWebServiceOutboundGateway.java:188)
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:109)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127)
... 36 more
我在这里进一步解释我的 POC,以进一步了解为什么在调用远程 Web 服务之前需要 JAXB 转换。
我在Spring Integ中执行的XSL转换从"事件"的输入消息转换为"fetchCodeByName"消息,如下所示。
<tns:fetchCodeByName xmlns:tns="http://www.veeaar.com/remote/wsdl/2010-1" xmlns:ns1="http://www.veeaar.com/remote/xml/2010-1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<ns1:Code>
<Name>xxx</Name>
</ns1:Code>
</tns:fetchCodeByName>
在 WSDL 中,fetchCodeByName 映射到 ns1 命名空间的 CodesType。已从"代码"模式 XSD 生成 JAXB 类。
在调用远程 Web 服务之前,如果我创建一个服务激活器并尝试将转换输出解组为 JAXB 对象,我们会将错误报告为解组任务,期望将"代码"作为根元素而不是"fetchCodeByName"。
如何解决此问题?
在 Spring 集成中有什么方法,我们可以在没有编组的情况下调用远程 Web 服务并取消编组输入消息吗?我们不能将 XSLT 输出直接定向到 int-ws:outbound-gateway 吗?
为什么需要在 WS 出站网关之前取消封送?你看,你再编组它!只需使用 WS 出站网关变体simple
(不带marshaller
),并按原样在其input
通道中发送 XSLT 转换器结果。