Jboss RxJava的Jersey客户端与resteasy冲突
我在JBOSS上部署了一个web应用程序。它包含对jersey rx客户机rxjava包的依赖关系,其中一个包对resteasy JAXR具有瞬时依赖关系 我有以下代码Jboss RxJava的Jersey客户端与resteasy冲突,jboss,jersey,resteasy,Jboss,Jersey,Resteasy,我在JBOSS上部署了一个web应用程序。它包含对jersey rx客户机rxjava包的依赖关系,其中一个包对resteasy JAXR具有瞬时依赖关系 我有以下代码 RxObservable.newClient() .target(fullURL) .request() .header("Authorization", "Bearer " + config.getApiKey()) .rx() .post(jav
RxObservable.newClient()
.target(fullURL)
.request()
.header("Authorization", "Bearer " + config.getApiKey())
.rx()
.post(javax.ws.rs.client.Entity.entity(context, MediaType.APPLICATION_JSON_TYPE), AIResponse.class)
.map(new Func1<AIResponse, String>() {
@Override
public String call(AIResponse res) {
return res.getType();
}
})
.subscribe(new Action1<String>() {
@Override
public void call(final String type) {
Log.info(type);
}
}, new Action1<Throwable>() {
@Override
public void call(final Throwable throwable) {
//async.resume(throwable);
Log.error(throwable.getMessage(), throwable);
}
}, new Action0() {
@Override
public void call() {
//async.resume(throwable);
Log.info("Done");
}
});
为什么构建方法返回org.jboss.resteasy.client.jaxrs.internal.ClientInvocation
,而不是JerseyInvocation
2017-03-20 12:18:43,678 ERROR [com.optawork.bot.CustomResource] (default task-2) org.jboss.resteasy.client.jaxrs.internal.ClientInvocation cannot be cast to org.glassfish.jersey.client.JerseyInvocation: java.lang.ClassCastException: org.jboss.resteasy.client.jaxrs.internal.ClientInvocation cannot be cast to org.glassfish.jersey.client.JerseyInvocation
at org.glassfish.jersey.client.rx.rxjava.JerseyRxObservableInvoker$2.call(JerseyRxObservableInvoker.java:89)
at org.glassfish.jersey.client.rx.rxjava.JerseyRxObservableInvoker$2.call(JerseyRxObservableInvoker.java:83)
at rx.Observable.unsafeSubscribe(Observable.java:10142)
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)
at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)
at rx.Observable.subscribe(Observable.java:10238)
at rx.Observable.subscribe(Observable.java:10205)
at rx.Observable.subscribe(Observable.java:10086)
at ai.api.AIDataService.converse(AIDataService.java:601)
为什么构建方法返回org.jboss.resteasy.client.jaxrs.internal.ClientInvocation
,而不是JerseyInvocation
这就是JAX-RS客户机API的设计方式。当我们尝试调用ClientBuilder.newBuilder
(这是在内部完成的)时,JAX-RSAPI会对JAX-RS客户端API的任何实现进行服务查找。如果没有,它会回到泽西岛。问题是,当服务查找完成时,RESTEasy的客户机位于类路径上
Jersey RX API有一个我们可以使用的from(Client)
方法,而不是默认的newClient
。这将允许我们传递显式的JerseyClient
,而不是使用JAX-rsapiClientBuilder.newBuilder/newClient
// actual JerseyClient which implements Client
Client client = new JerseyClientBuilder().build();
RxObservable.from(client)
JerseyClientBuilder
的API与JAX-RSClientBuilder
几乎相同,因此您可以以几乎相同的方式使用它。我遇到了一个类似的问题,即使用JerseyClientBuilder.newClientBuilder()以某种方式返回RestEASY客户端。“新”的球衣设计师解决了这个问题。谢谢参考
// actual JerseyClient which implements Client
Client client = new JerseyClientBuilder().build();
RxObservable.from(client)