我正在尝试使用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)
答案 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。
试试这段代码:
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插件更好,更有效。