Apache Camel 和 Web 服务 [英] Apache Camel and web services

查看:41
本文介绍了Apache Camel 和 Web 服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图了解如何将 Apache Camel 与任何提供 WSDL 的 Web 服务集成以生成其类,然后调用他的方法返回一些请求.

I am trying to understand how to integrate Apache Camel with any web service that provides a WSDL to generate its classes to afterward call his methods to return some requests.

我对 camel-spring-wscamel-cxf 包进行了一些研究.正如我所看到的,Spring Web 服务组件不支持使用 WSDL,但 CXF 支持,但它只支持与托管在 CXF 中的 JAX-WS 服务的连接.

I've studied a little about camel-spring-ws and camel-cxf packages. As I can see Spring Web Services Component does not support the use of WSDL but CXF does, however it only supports connections with JAX-WS services hosted in CXF.

如果我从客户那里收到 WSDL,我可以使用 CXF 吗?或者我需要创建一个自定义组件来使用他的方法吗?

If I receive a WSDL from a customer, could I use CXF? Or would I need to create a custom component to use his methods?

据我所知,实现它的最简单方法是创建一个 Process 或一个 Bean 来调用远程 Web 服务.

As far as I can see the simplest way to implement it would be creating a Process or a Bean to invokes the remote web service.

我尝试实现一个生产者来调用远程 Web 服务.我的beans.xml:

I've tried to implement a producer to call a remote web service. My beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:cxf="http://camel.apache.org/schema/cxf"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml"/> 

    <cxf:cxfEndpoint 
        id="osvEndpoint" 
        address="http://10.193.1.90:8767/" 
        serviceClass="siemens_hiq8000.SiemensHiq8000PortType"/> 

    <bean id="osvWebServiceProcessor" class="br.com.willianantunes.processor.OsvWebServiceProcessor" />

</beans>

我的路线:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <routeContext id="osvWebServiceInvoke" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="quartz2://test?cron=0/10+*+*+*+*+?"/>
            <process ref="osvWebServiceProcessor" />
            <to uri="cxf:bean:osvEndpoint"/>
            <to uri="log:live?level=INFO" />
        </route>
    </routeContext>

</beans>

还有我的处理器:

public class OsvWebServiceProcessor implements Processor
{
    @Override
    public void process(Exchange exchange) throws Exception
    {
        Message inMessage = exchange.getIn();

        // The method to be called
        inMessage.setHeader(CxfConstants.OPERATION_NAME, "getVersion");

        // Parameters to be passed into the web service
        List<Object> params = new ArrayList<Object>();
        ResultCodeStructHolder resultCodeStructHolder = new ResultCodeStructHolder();
        VersionDataHolder versionDataHolder = new VersionDataHolder();
        params.add(resultCodeStructHolder);
        params.add(versionDataHolder);
        inMessage.setBody(params);
    }
}

getVersion 方法需要一些参数如下:

The method getVersion needs some parameters as followed:

public void getVersion(siemens_hiq8000.holders.ResultCodeStructHolder result, 
siemens_hiq8000.holders.VersionDataHolder versionData) throws java.rmi.RemoteException;

我怎样才能通过它们?这些持有者必须填写网络服务的响应.当我运行我的项目时,出现以下错误:

How can I pass them? These holders must be filled with the response of the web service. When I run my project I get the following error:

[main] INFO org.apache.cxf.service.factory.ReflectionServiceFactoryBean - Creating Service {http://siemens_hiq8000/}SiemensHiq8000PortType from class siemens_hiq8000.SiemensHiq8000PortType
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.cxf.wsdl11.WSDLEndpointFactory.createEndpointInfo(Lorg/apache/cxf/service/model/ServiceInfo;Lorg/apache/cxf/service/model/BindingInfo;Ljava/util/List;)Lorg/apache/cxf/service/model/EndpointInfo;
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.java:287)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:144)
    at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91)
    at org.apache.camel.component.cxf.CxfSpringEndpoint.createClient(CxfSpringEndpoint.java:116)
    at org.apache.camel.component.cxf.CxfProducer.doStart(CxfProducer.java:76)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:2869)
    at org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1097)
    at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1058)
    at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:405)
    at org.apache.camel.impl.ProducerCache.acquireProducer(ProducerCache.java:123)
    at org.apache.camel.processor.SendProcessor.doStart(SendProcessor.java:219)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:79)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.RedeliveryErrorHandler.doStart(RedeliveryErrorHandler.java:1272)
    at org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:44)
    at org.apache.camel.support.ChildServiceSupport.start(ChildServiceSupport.java:31)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.interceptor.DefaultChannel.doStart(DefaultChannel.java:153)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:61)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.MulticastProcessor.doStart(MulticastProcessor.java:1060)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:59)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:103)
    at org.apache.camel.util.ServiceHelper.startServices(ServiceHelper.java:89)
    at org.apache.camel.processor.DelegateAsyncProcessor.doStart(DelegateAsyncProcessor.java:79)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:74)
    at org.apache.camel.impl.RouteService.startChildService(RouteService.java:340)
    at org.apache.camel.impl.RouteService.warmUp(RouteService.java:182)
    at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3090)
    at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3020)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:2797)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:2653)
    at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:167)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2467)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2463)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2486)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2463)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2432)
    at org.apache.camel.spring.SpringCamelContext.maybeStart(SpringCamelContext.java:255)
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:121)
    at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:332)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:773)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
    at org.apache.camel.spring.Main.createDefaultApplicationContext(Main.java:216)
    at org.apache.camel.spring.Main.doStart(Main.java:156)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:150)
    at br.com.willianantunes.test.Program.main(Program.java:12)

解决方案

如果你想让camel-cxf扮演制作人的角色,只需按照以下步骤为例:

Solution

For the ones who want a camel-cxf to act like a producer, just follow the steps bellow as an example:

  1. 首先,我下载可用于 OpenScape Voice 的最后一个 WSDL 文件此处 在这个开发者页面.
  2. 客户端代码对于在选项 serviceClass 中通知 SEI(服务端点接口)是必要的.您可以生成发出以下命令:

wsdl2java -client -d "TargetFolderHere" -autoNameResolution "OpenScape-Voice_V8.00.28.01.wsdl"

wsdl2java -client -d "TargetFolderHere" -autoNameResolution "OpenScape-Voice_V8.00.28.01.wsdl"

  1. 在您的项目中插入生成的客户端类.这同样适用于 WSDL 文件.
  2. 在你的 beans.xml 中通知 cxfEndpoint 配置.

  1. Insert the generated client classes in your project. The same applies to the WSDL file.
  2. In your beans.xml inform the cxfEndpoint configuration.

<import resource="classpath:META-INF/cxf/cxf.xml" />    

<cxf:cxfEndpoint xmlns:urn="urn:openscape-voice"
    id="osvEndpoint" 
    address="http://10.193.1.90:8767/" 
    serviceClass="voice.openscape.OpenscapeVoicePortType"
    wsdlURL="OpenScape-Voice_V8.00.28.01.wsdl"
    serviceName="urn:openscape_voice">  
</cxf:cxfEndpoint>

<bean id="osvWebServiceProcessor" class="br.com.willianantunes.processor.OsvWebServiceProcessor" />

  • 在 Web 服务调用之前,配置处理器以通知参数和要执行的方法.

  • Before the web service call, configure a processor to inform the parameters and the method to execute.

    Message inMessage = exchange.getIn();
    
    // The method to be called
    inMessage.setHeader(CxfConstants.OPERATION_NAME, "GetVersion");
    
    // Parameters to be passed into the web service
    List<Object> params = new ArrayList<Object>();
    
    Holder<ResultCodeStruct> result = new Holder<>();
    Holder<VersionData> versionData = new Holder<>();
    
    params.add(result);
    params.add(versionData);
    inMessage.setBody(params);
    

  • 现在你可以配置路由并插入你的camelContext作为参考来完成任务.

  • Now you can configure the route and insert in your camelContext as a ref to accomplish the task.

    <routeContext id="osvWebServiceInvoke" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="quartz2://test?cron=0/10+*+*+*+*+?"/>
            <process ref="osvWebServiceProcessor"/>
            <to uri="cxf:bean:osvEndpoint"/>
            <to uri="log:live?level=INFO"/>
        </route>
    </routeContext>
    

  • 日志打印如下:

    - Quartz scheduler 'DefaultQuartzScheduler-main-application' initialized from an externally provided properties instance.
    - Quartz scheduler version: 2.2.1
    - Job Camel_main-application.test (triggerType=CronTriggerImpl, jobClass=CamelJob) is scheduled. Next fire date is Tue Mar 31 09:12:00 BRT 2015
    - AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.
    - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
    - Creating Service {urn:openscape-voice}openscape_voice from WSDL: OpenScape-Voice_V8.00.28.01.wsdl
    - Could not find endpoint/port for {urn:openscape-voice}openscape_voicePortTypePort in wsdl. Using {urn:openscape-voice}openscape_voice.
    - Route: route1 started and consuming from: Endpoint[quartz2://test?cron=0%2F10+*+*+*+*+%3F]
    - Starting scheduler.
    - Scheduler DefaultQuartzScheduler-main-application_$_NON_CLUSTERED started.
    - Total 1 routes, of which 1 is started.
    - Apache Camel 2.15.0 (CamelContext: main-application) started in 10.759 seconds
    - Exchange[ExchangePattern: InOnly, BodyType: org.apache.cxf.message.MessageContentsList, Body: [null, javax.xml.ws.Holder@508696f5, javax.xml.ws.Holder@333cf1ba]]
    

    我在 CXF 依赖项方面遇到了一些问题,所以这是我的 pom.xml:

    I had some problems with CXF dependencies, so here is my pom.xml:

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-cxf</artifactId>
        <version>${camel-version}</version>
    </dependency>
    <!-- Apache CXF -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>${cxf.version}</version>
    </dependency>   
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>${cxf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-bindings-soap</artifactId>
        <version>${cxf.version}</version>
    </dependency>   
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- End of Apache CXF -->
    

    您可以设计一个新的处理器或 bean 来从 Web 服务中获取带有响应的正文消息(不是纯 SOAP 消息,而是之前使用的 POJO).

    You can design a new processor or a bean to get the body message with the response (not the pure SOAP message, but the POJO used before) from the web service.

    @Namphibian 提供的答案还可以,也符合我的目的.

    The answer provided by @Namphibian is OK and can fit to my purpose as well.

    推荐答案

    您指的是契约优先或 Web 服务的自上而下开发.在这种方法中,您从 WSDL 定义生成存根代码并在您的开发中使用这些类等.我已经这样做了很多,并且我使用了 WSDL 来自在 .Net、Java、PHP 甚至 Delphi 中创建的服务(尽管 Delphi 违反了 WSI 合规性,但甚至不去那里).

    You are referring to contract first or top-down development of Web-services. In this approach you generate stub code from the WSDL definitions and use these classes etc in your development. I have done this a lot and I have used WSDL's from service created in .Net, Java, PHP and even Delphi(though Delphi breaks WSI compliance don't even go there).

    CXF 将从您可以指向库的几乎任何 WSDL 生成类.首先,您需要在 Maven POM 文件中添加一个条目,该条目告诉 Maven 为您从 WSDL 生成类.

    CXF will generate classes from just about any WSDL you can point the library at. First thing is that you need to add an entry to your Maven POM file which tell Maven to generate classes from the WSDL for you.

    将以下内容添加到您的 POM 文件中:

    Add the following to your POM file:

    <plugin>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>get the latest version or the version you want</version>
        <executions>
            <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
    
                <sourceRoot>
                ${basedir}/target/generated/src/main/java
                </sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                    <wsdl>
                    URI/FILE PATH OF WSDL HERE
                    </wsdl>
                    <extraargs>
                    <extraarg>-impl</extraarg> <-- use this if you want to implement the service i.e. create it
                    <extraarg>-client</extraarg> <-- us this if you want to generate a client for the service.
                    </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
            <goal>wsdl2java</goal>
            </goals>
            </execution>
        </executions>
    </plugin>
    

    您现在可以运行 maven 目标 mvn generate-source 以生成使用此文件所需的存根类.

    You can now runt he maven goal mvn generate-source to generate the needed stub classes to use this file.

    我通常会使用处理器/bean 来进行实际实现,因为我生产和/使用的大多数 Web 服务都具有相当复杂的数据结构.然而,这真的取决于服务.

    I normally drop into a processor/bean to do the actual implementation as most of the web-services I produce and or consume have rather complex data structures. However this really depends on the service.

    所以简而言之,您可以使用 CXF 为几乎(Delphi 的家伙,您在听吗?)网络服务生成存根类,然后在处理器中使用这些生成的类来实现客户端和/或服务器.

    So in short you can use CXF to generate the stub classes for almost(Delphi guys are you listening?) web-service then use these generated classes in a processor to implement the client and or server.

    更新:

    根据您上面的示例,您走在正确的轨道上.首先,我想讨论一下骆驼中的 CXF,这是一个重要的概念.例如,当您看到以下代码时,CXF bean 与其他 bean 略有不同:

    Based on your example above you are on the right track. First I want to just discuss something about CXF in camel which is an important concept. The CXF beans are a little different than the other beans for example when you see the following code:

    <from uri="file://....."/>
    <to uri="mock"/>
    

    文件组件是一个生产者,它毕竟产生文件,而模拟组件是一个消费者,因为它获取文件组件产生的数据并消费它来完成它的任务.

    The file component is a producer it produces files after all and the mock component is a consumer as it takes data produced by the file component and consumes it to do its task.

    Web 服务稍微扭曲了这个概念.当您有一条路线时,例如:

    Web-services twists this concept slightly. When you have a route such as:

    cxf bean 被称为生产者,因为它调用 Web 服务.当您使用 cxf bean 作为消费者或在您的路线的 <from> 部分使用时,它会变得有趣.

    The cxf bean is called a producer as it calls a web service. It gets interesting when you use a cxf bean as a consumer or in the <from> part of your route.

    以下是网络服务消费者的示例:

    Here is an example of a web-service consumer:

    <from uri="cxf:bean:someService" />
    

    CXF bean 正在使用 Web 服务调用,然后将消息发送到其他各个部分.这允许您公开一些非常复杂的内容,例如从 FTP 服务器下载文件,使用 JDBC 调用丰富内容,然后将丰富的数据作为 Web 服务针对 SAP 系统进行处理.您的路由将 <from> 中的 cxf bean 作为服务公开,路由的其余部分可以完成所有集成,但它作为 Web 服务公开.非常强大的概念.

    The CXF bean is consuming the web-service call and then sending the message on to various other parts. This allows you to expose something very complex such as downloading a file from an FTP server, enriching the contents to with a JDBC call and then processing the enriched data against a SAP system as web-service. Your route exposes the cxf bean in the <from> as the service the rest of the route can do all the integration but it is exposed as a web-service. VERY powerful concept.

    在您的情况下,您的 Web 服务 bean 是生产者或客户端.我通常不为客户端使用 cxf bean,因为我使用的服务可能相当复杂,我需要 Java 的全部功能来处理这些情况.所以我会告诉你如何做到这一点.

    In your case your web-service bean is a producer or a client. I typically don't use cxf beans for clients as te services I consume can be rather complex and i need the full power of Java to handle these cases. So I will show you how to do it this way.

    所以在我的世界里,我会走以下骆驼路线:

    So in my world I would do the following camel route:

    <routeContext id="osvWebServiceInvoke" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="quartz2://test?cron=0/10+*+*+*+*+?"/>
            <process ref="osvWebServiceProcessor" />
            <to uri="log:live?level=INFO" />
        </route>
    </routeContext>
    

    我的处理器 bean 会变成这样:

    And my processor bean will change to this:

    public class OsvWebServiceProcessor implements Processor
    {
        @Override
        public void process(Exchange exchange) throws Exception
        {
            Message inMessage = exchange.getIn();
    
    
    
           /*
                  SInce i dont have access to the WSDL and XSD I cant say how the following code will look but essentially you would need to call the web-service here in Java code and get the result back.
    
           */
          outSOAPMsg=  siemens_hiq8000.SiemensHiq8000PortType.OperationName(inSOAPMsg)
          //set the reply into the inbody and send onto other components for processing.
          inMessage.setBody(outSOAPMsg);
    
      }
    }
    

    查看您的代码后,我意识到您的存根类似乎未正确生成.我强烈建议您将我帖子中描述的项目添加到您的 POM 文件中.如果您可以发布一些 WSDL 和 XSD 文件,我可以为您提供更具描述性的答案.

    Looking at your code I realised that it appears that your stub classes are not generated correctly. I strongly urge you to add the items described in my post to your POM file. If you could post some of the WSDL and XSD files I could give you more descriptive answer.

    这篇关于Apache Camel 和 Web 服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆