当前位置: 首页 > 知识库问答 >
问题:

Apache Camel调用SOAP服务

孙思源
2023-03-14

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

这是我的camel上下文文件

<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 id="id">"US"</constant>
            </setBody>
            <bean beanType="GetFullCountryInfoBuilder.class" 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"/>
            <setBody id="_setBody1">
                <simple>${body}</simple>
            </setBody>
            <log id="_log1" message=">>>${body}"/>
        </route>
    </camelContext>
</beans>

这是我的输入bean

import org.oorsprong.websamples.FullCountryInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class GetFullCountryInfoBuilder {
    
    public GetFullCountryInfoBuilder() {}

    @Value("${id}")
    private java.lang.String id;
    @Bean
    public FullCountryInfo getFullCountryInfo(java.lang.String id) {
        FullCountryInfo request = new FullCountryInfo();
        request.setSCountryISOCode(id);

        return request;
    }
}

围绕它有许多问题。首先,我不能将输入参数传入主体。我试着像这样设置身体

      <web:FullCountryInfo xmlns:web="http://www.oorsprong.org/websamples.countryinfo">
         <web:sCountryISOCode>US</web:sCountryISOCode>
      </web:FullCountryInfo>

但没有得到响应或只是没有记录。我已经尝试使用bean创建请求,但我得到

InvocationTargetException: Error creating bean with name 'getFullCountryInfoBuilder': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'id' in value "${id}"

当我用常量替换占位符时

InvocationTargetException: Error creating bean with name 'getFullCountryInfo' defined in class path resource [com/example/GetFullCountryInfoBuilder.class]: Unsatisfied dependency expressed through method 'getFullCountryInfo' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

或者当我从getFullCountryInfo Camel方法中删除输入参数时,无法找到GetFullCountryInfoBuilder类

InvocationTargetException: org.apache.camel.FailedToCreateRouteException: Failed to create route simple-route at: >>> Bean[GetFullCountryInfoBuilder.class] <<< in route: Route(simple-route)[[From[timer:timerName?delay=0&repeatCoun... because of java.lang.ClassNotFoundException: GetFullCountryInfoBuilder.class

共有1个答案

漆雕博
2023-03-14

前两个错误发生在将参数传递给bean方法的字段中。

Could not resolve placeholder 'id' in value "${id}" 

表达式 @Value(“${id}”) 引用名为 id 的 Spring 属性,但它不存在。由于您使用此 ID 定义了路由步骤,因此我怀疑您希望将您设置为消息正文的值“US”传递给该方法。

Spring注释< code>@Value不知道您的骆驼路线,因此这不起作用。

但是,您可以使用Camel注释告诉Camel将您设置为“US”的消息体作为参数id注入到方法中。

getFullCountryInfo(@Body String id) {

您还可以使用sethead er将值设置到消息标头中,并使用注释@head er将其注入到方法中。因为当您有输入消息(而不是计时器)时,您通常不想覆盖正文。

另一个问题是bean无法解析,即使您删除了参数并将主体设置为static。

ClassNotFoundException: GetFullCountryInfoBuilder.class

我想这是因为 beanType 应该这样定义

org.oorsprong.websamples.GetFullCountryInfoBuilder // i guessed the package name

因此它必须是完整的包/类名,但没有“.class”后缀。

 类似资料:
  • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

  • 我没有在肥皂服务公司工作过。 目前,我确实有一个wsdl文件,并将输入dto与之一起传递。 此服务将保存该数据。 我怎样才能从我的Spring启动应用程序中调用这个肥皂服务。我熟悉使用RestTemboard调用rest服务。 试过下面的一个,看起来有点复杂。任何参考资料都会很有帮助。 https://howtodoinjava.com/spring-boot/spring-soap-client

  • 我正在尝试从Spring Boot调用SOAP Web服务,但我遇到了问题。我使用maven-jaxb2-plugin从这个WSDL自动生成了类: 遵循本指南:https://spring.io/guides/gs/consuming-web-service/ 我还创建了SOAP客户端来调用TR069CheckDevice可用性。 我的客户端类如下所示: 我的SoapClient配置类是: 问题是

  • 我需要从REST服务调用SOAP Webservice。我在我的项目中使用Spring集成。目前,我正在使用基于xml的配置来实现目标。但我想用java dsl编写代码。请帮助我如何使用Spring集成DSL从REST服务调用SOAP服务。 一个例子会很有帮助。

  • 我对webservice世界相对来说是个新手,我的研究似乎让我困惑而不是启发,我的问题是我得到了一个库(jar),我必须用一些webservice功能来扩展它。 这个库将共享给其他开发人员,在jar中的类中,将有一个调用webservice的方法的类(该方法实质上设置类的属性,执行一些业务逻辑,如将对象存储在db中等,并将对象与这些修改一起发回)。我希望对这个服务的调用尽可能简单,希望尽可能简单,

  • 现在请帮助,我想通过SOAP调用一个api,并使用httpclient 4.5.5