使用Apache Camel与spring-ws调用SOAP服务遇类型转换异常求助
问题分析与解决方案
你当前的调用方式不是正确的,抛出的NoTypeConversionAvailableException已经明确说明了问题:Camel的spring-ws组件默认要求消息体是javax.xml.transform.Source类型(比如StreamSource、DOMSource这类),但你直接传入了自定义的AccountRequest对象,Camel没有内置的转换器能完成这个类型转换,所以报错了。
下面给你两种可行的解决方法:
方法1:手动用JAXB将对象转为XML Source
如果你的AccountRequest类已经添加了JAXB注解(比如@XmlRootElement),可以手动序列化对象为XML,再包装成Source:
from("direct:test") .routeId("account.get") .process(exchange -> { AccountRequest request = createAccountRequest(); // 初始化JAXB上下文并序列化对象 JAXBContext jaxbContext = JAXBContext.newInstance(AccountRequest.class); StringWriter writer = new StringWriter(); jaxbContext.createMarshaller().marshal(request, writer); // 将XML字符串转为StreamSource exchange.getIn().setBody(new StreamSource(new StringReader(writer.toString()))); }) .to("spring-ws:http://localhost:8090/AccountServices/AccountOverviewService") .log("Got Request for account-detail");
方法2:用Camel JAXB组件自动转换
这种方法更简洁,只需要引入camel-jaxb依赖,让Camel自动帮你完成对象到XML的转换:
首先添加Maven依赖:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jaxb</artifactId> <version>2.18.3</version> </dependency>
然后修改路由,添加marshal().jaxb()步骤:
from("direct:test") .routeId("account.get") .process(exchange -> { exchange.getIn().setBody(createAccountRequest()); }) .marshal().jaxb("com.test") // 替换为你的AccountRequest所在的包路径 .to("spring-ws:http://localhost:8090/AccountServices/AccountOverviewService") .log("Got Request for account-detail");
额外注意
如果你的SOAP服务要求消息包含完整的SOAP信封结构,可能还需要进一步处理(比如使用camel-soap组件或者手动构建SOAP信封),但上面的两种方法已经能解决当前的类型转换异常问题。
内容的提问来源于stack exchange,提问作者Yogesh Prajapati
相关产品推荐
相关产品推荐

