Apache CXF + JavaFX未找到命名空间的管道启动器

时间:2015-06-13 22:31:27

标签: apache javafx cxf

我正在尝试使用CXF运行JavaFX Rest客户端。一个非常简单的测试。当我尝试获取URL时,我得到了org.apache.cxf.BusException:找不到名称空间http://cxf.apache.org/transports/http的管道启动器。我在这里看了一些相关的问题,但没有运气。任何帮助,将不胜感激。 然后我只添加了maven依赖是cxf-rt-rs-client 3.1.0 代码是:

WebClient client = WebClient.create("http://www.stackoverflow.com"); client.type("text/html").accept("text/html"); System.out.println(client.get());

堆栈跟踪:

Caused by: org.apache.cxf.BusException: No conduit initiator was found for the namespace http://cxf.apache.org/transports/http.
at org.apache.cxf.bus.managers.ConduitInitiatorManagerImpl.getConduitInitiator(ConduitInitiatorManagerImpl.java:110)
at org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(AbstractConduitSelector.java:104)
at org.apache.cxf.endpoint.UpfrontConduitSelector.selectConduit(UpfrontConduitSelector.java:77)
at org.apache.cxf.message.ExchangeImpl.getConduit(ExchangeImpl.java:159)
at org.apache.cxf.interceptor.MessageSenderInterceptor.getConduit(MessageSenderInterceptor.java:71)
at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:624)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1100)

3 个答案:

答案 0 :(得分:4)

阴影会覆盖bus-extension.txt文件。以编程方式,您可以通过初始化来修复它。

void initializeCxf() {
    final Bus defaultBus = BusFactory.getDefaultBus();
    final ConduitInitiatorManager extension = defaultBus.getExtension(ConduitInitiatorManager.class);
    extension.registerConduitInitiator("http://cxf.apache.org/transports/http", new HTTPTransportFactory());
}

根据@hba的评论,如果以上情况不起作用,您也可以尝试以下

extension.registerConduitInitiator("http://cxf.apache.org/transports/http", new HTTPTransportFactory(defaultBus));

答案 1 :(得分:0)

你对Maven的依赖很好。

根据CXF 3.x指南,客户端构造看起来有点 off ,其中支持JAX-RS 2.0。

请参阅AX-RS 2.0 Client API

试试这段代码:

    WebTarget target = ClientBuilder.newClient().target("http://stackoverflow.com/");

    Response response = target.request().get();
    System.out.println(response.getEntity().getClass().getName());

使用此代码,您将了解响应实体是一个输入流..一系列字符是StackOverflow主页的HTML内容。

如果您喜欢冒险,并证明我不是骗子,请将以下依赖项添加到您的POM中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency> 

然后尝试这个:

    WebTarget target = ClientBuilder.newClient().target("http://stackoverflow.com/");
    System.out.println(IOUtils.toString((InputStream) target.request().get().getEntity(), "UTF-8"));

您将获得StackOverflow主页的文本渲染(在标准输出上) - 相当于在浏览器中执行“查看源”操作。

我不知道您的最终目标是什么,但如果您尝试使用StackExchange网络上的信息构建任何有用的东西,我建议使用他们的API here

祝你好运!

答案 2 :(得分:0)

在JavaFX项目中使用Apache CXF REST客户端时遇到了同样的异常。代码如下:

MyClass rest = (MyClass) JAXRSClientFactory.create(endpoint, MyClass.class, Collections.singletonList(new JacksonJsonProvider()));
System.out.println("Service health: " + rest.health()); 

使用普通Java项目进行的测试可以正常使用相同的代码和相同的依赖项。这显然是JavaFX和Apache CXF之间的冲突。我想弄明白为什么。

如果你们已经解决了这个问题,那么更新这个帖子应该会很棒,这是谷歌搜索的唯一结果。

更新的解决方案: 过了一会儿,我发现默认的Maven项目在插件“maven-dependency-plugin”中没有包含足够的依赖项。我试图在列表中添加更多包但仍然不起作用。所以最终的解决方案是在这个帖子中:How to package an Apache CXF application into a monolithic JAR with the Maven "shade" plugin。 Shade插件更好,更有效。