【问题标题】:Apache CXF + JavaFX No conduit initiator was found for the namespaceApache CXF + JavaFX 没有为命名空间找到管道启动器
【发布时间】:2015-06-13 22:31:27
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: apache javafx cxf


    【解决方案1】:

    阴影覆盖了 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));
    

    【讨论】:

    • 这里描述的这个解决方案对我不起作用。我赞成它,因为它基本上是正确的。我必须执行以下操作:extension.registerConduitInitiator("cxf.apache.org/transports/http", new HTTPTransportFactory(defaultBus))
    【解决方案2】:

    您的 Maven 依赖项很好。

    根据 CXF 3.x 指南,客户端构造看起来有点偏离,其中支持 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

    祝你好运!

    【讨论】:

    • 感谢您的帮助大卫,但您建议的代码也不起作用(同样的例外),但我用 maven 创建了一个简单的 Java SE 应用程序,然后将相同的代码添加到 main 函数它奏效了。我认为问题与 CXF 和 JavaFX 交互有关,但仍然没有找到原因。
    • 哦,谢谢,这很好奇。目前我想不出 JavaFX 中可能会产生什么干扰。
    • 可能与类路径有关。我会尝试找出原因并发布原因。感谢您的支持。
    【解决方案3】:

    在 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。阴影插件更好并且有效。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多