【问题标题】:Apache Camel invoke SOAP service cast problemApache Camel 调用 SOAP 服务转换问题
【发布时间】:2023-03-14 22:41:01
【问题描述】:

我是 Apache Camel 的新手,我使用的是 Red Hat CodeReady Studio 12.16.0.GA。我想调用肥皂网络服务。这个例子我用过https://tomd.xyz/camel-consume-soap-service/

这是我的骆驼上下文文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:camel-cxf="http://camel.apache.org/schema/cxf"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd        http://camel.apache.org/schema/spring       https://camel.apache.org/schema/spring/camel-spring.xsd http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd">
    <bean class="org.apache.cxf.transport.common.gzip.GZIPInInterceptor" id="gZipInInterceptor"/>
    <bean
        class="org.apache.cxf.transport.common.gzip.GZIPOutInterceptor" id="gZipOutInterceptor"/>
    <camel-cxf:cxfEndpoint
        address="http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso"
        id="fullCountryInfoResponseClient" serviceClass="org.oorsprong.websamples_countryinfo.CountryInfoServiceSoapType">
        <camel-cxf:inInterceptors>
            <ref bean="gZipInInterceptor"/>
        </camel-cxf:inInterceptors>
        <camel-cxf:outInterceptors>
            <ref bean="gZipOutInterceptor"/>
        </camel-cxf:outInterceptors>
    </camel-cxf:cxfEndpoint>
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="bean-66d2672d-c6c0-4984-bc31-90bc30bfaaef"/>
    <camelContext id="camel"
        xmlns="http://camel.apache.org/schema/spring" xmlns:order="http://fabric8.com/examples/order/v7">
        <route id="simple-route">
            <from id="_to2" uri="timer:timerName?delay=0&amp;repeatCount=1"/>
            <setBody id="_setBody2">
                <constant>"US"</constant>
            </setBody>
            <bean beanType="com.example.GetFullCountryInfoBuilder"
                id="_bean1" method="getFullCountryInfo"/>
            <setHeader headerName="operationNamespace" id="_setHeader1">
                <constant>http://www.oorsprong.org/websamples.countryinfo</constant>
            </setHeader>
            <setHeader headerName="operationName" id="_setHeader2">
                <constant>FullCountryInfo</constant>
            </setHeader>
            <to id="_to1" uri="cxf:bean:fullCountryInfoResponseClient"/>
            <bean beanType="com.example.GetFullCountryInfoBuilder"
                id="_bean2" method="getFullCountryInfoOutput"/>
            <log id="_log1" message=">>>${body}"/>
        </route>
    </camelContext>
</beans>

这是我的输入 bean

public class GetFullCountryInfoBuilder {
    
    public GetFullCountryInfoBuilder() {}
    @Bean
    public FullCountryInfo getFullCountryInfo(@Body String id) {
        FullCountryInfo request = new FullCountryInfo();
        request.setSCountryISOCode(id);
        return request;
    }
    @Bean
    public String getFullCountryInfoOutput(@Body FullCountryInfoResponse response) {
        String ret = response.getFullCountryInfoResult().getSName() + " - " + response.getFullCountryInfoResult().getSCapitalCity() + " - " + response.getFullCountryInfoResult().getSCurrencyISOCode();
        return ret;
    }
}

还是报错 org.apache.cxf.interceptor.Fault: org.oorsprong.websamples.FullCountryInfo cannot be cast to java.lang.String 看起来 CXF 不处理 FullCountryInfo 对象,但 String 和 Camel 尝试对其进行转换。
当我将 getFullCountryInfo 的返回更改为 String 时,此异常消失,但又出现了几个异常。

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: org.oorsprong.websamples.FullCountryInfoResponse but has value: [org.oorsprong.websamples.TCountryInfo@3c5110df] of type: org.apache.cxf.message.MessageContentsList on: Message[]. 
Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.oorsprong.websamples.FullCountryInfoResponse with value [org.oorsprong.websamples.TCountryInfo@3c5110df]] Caused by: No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.oorsprong.websamples.FullCountryInfoResponse with value [org.oorsprong.websamples.TCountryInfo@3c5110df]. Exchange[ID-sw70-1599555257341-0-1].

【问题讨论】:

    标签: soap apache-camel redhat


    【解决方案1】:

    因此,CXF 的输入不是示例中描述的对象,而是字符串。 CXF 的输出是 org.apache.cxf.message.MessageContentsList,您必须将其转换为字符串以记录它。在这种情况下,我使用了 getFullCountryInfoOutput bean。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      相关资源
      最近更新 更多