首页 > 解决方案 > Camel CXF(代码优先)Tomcat示例——如何部署客户端

问题描述

我基于 Camel CXF(代码优先)Tomcat 示例构建了一个项目,其中 CFX Web 服务由 java 接口定义。在示例中,WS 接口是 IncidentService.java。在我的项目中,服务接口称为 Ingester,并定义了一个上传(字符串正文,字符串 id)方法。该服务部署到 tomcat,我使用以下代码从另一个项目中的客户端调用该服务:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
                factory.setServiceClass(Ingester.class);
                factory.setAddress(toURL);
                Ingester client = (Ingester) factory.create();
                String out = client.upload(exchange.getIn().getBody(String.class),"2");

客户端项目通过将服务器项目导入为引用项目(在 Eclipse 中)来引用 Ingester 接口。

这一切都按预期工作。

现在我只想在用户机器上部署客户端(并让它仍然工作)。

第一种方法我只是简单地 jar'd 客户端(使用 maven)。当我运行可执行 jar 时,我收到未找到 ws.Ingester 类的错误。

    org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-VSWINLT019-1541482662292-0-1]
        at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1846)
        at org.apache.camel.impl.DefaultExchange.setException(DefaultExchange.java:385)
        at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:66)
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
        at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)
        at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:79)
        at java.util.TimerThread.mainLoop(Unknown Source)
        at java.util.TimerThread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: ws.Ingester 
        at qp.PullRoute$1.process(PullRoute.java:54)
        at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
        ... 9 more
Caused by: java.lang.ClassNotFoundException: ws.Ingester

我不确定该怎么做,我尝试了几种方法都没有成功。

我想做类似以下的事情,删除对 IncidentService 接口的引用:

.to("cxf://http://localhost:8080/data-ingest-service/webservices/ws"
            + "?serviceClass=ws.Ingester"
            + "?serviceName=upload"
            + "?id=1")

这是正确的方向吗?我得到以下异常,如何使它工作?

Exception in thread "main" org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[cxf://http://localhost:8080/data-ingest-service/webservices/ws?serviceClass=ws.Ingester?serviceName=upload?id=1] <<< in route: Route(route1)[[From[timer://Timer?period=60000]] -> [OnExcep... because of Failed to resolve endpoint: cxf://http://localhost:8080/data-ingest-service/webservices/ws?serviceClass=ws.Ingester%3FserviceName%3Dupload%3Fid%3D1 due to: ws.Ingester?serviceName=upload?id=1

有人可以给我这方面的建议吗?'id' 参数似乎是问题的一部分,我假设 body 将传递给 body 参数,就像在上面的代码第一个示例中一样。

我不认为打包服务器并将其作为依赖存储库包含在内是正确的方法,主要是因为它看起来有点矫枉过正。

谢谢

标签: javaapache-camelcxf

解决方案


我得到了这个工作,但我不相信这是最好的解决方案。我将服务器作为依赖项包含在客户端中,这真的是个好主意吗?我在我的 POM 中添加了 Shade 插件的东西(从这个答案Apache CXF 客户端在 Eclipse 中加载正常,但独立 jar 在 WSDLServiceFactory 中抛出 NullpointerException


推荐阅读