我的目标是使用 jax-rs 客户端连接到 MobileFirst Java适配器内的后端,但我真的卡住了,需要帮助
抛出异常的代码:
javax.ws.rs.client.Client client = javax.ws.rs.client.ClientBuilder.newClient();
抛出的异常:
java.lang.ClassNotFoundException:org.glassfish.jersey.client.JerseyClientBuilder`
代码位于 IBM Liberty服务器上部署的 MobileFirst服务器版本8.0 上的Java适配器内。
jaxrsClient-2.0 和 jaxrs-2.0 功能在server.xml
的服务器功能管理器中启用。
<feature>jaxrs-2.0</feature>
<feature>jaxrsClient-2.0</feature>
应用程序类的加载配置如下:
<application id="mfp" name="mfp" location="mfp-server.war" type="war">
<classloader delegation="parentLast" apiTypeVisibility="spec, ibm-api, third-party"></classloader>
</application>
以下是异常跟踪:
java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder
at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:103)
at javax.ws.rs.client.ClientBuilder.newClient(ClientBuilder.java:114)
at
...............................
at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:83)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:504)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:574)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:929)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1018)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder
at com.ibm.mfp.server.core.shared.ParentLastClassLoader.findClass(ParentLastClassLoader.java:192)
at com.ibm.mfp.server.core.shared.ParentLastClassLoader.loadClass(ParentLastClassLoader.java:165)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at javax.ws.rs.client.FactoryFinder.newInstance(FactoryFinder.java:113)
at javax.ws.rs.client.FactoryFinder.find(FactoryFinder.java:206)
at javax.ws.rs.client.ClientBuilder.newBuilder(ClientBuilder.java:86)
... 69 more
请帮忙!
答案 0 :(得分:1)
我正在研究类似的要求,我在解决异常之前尝试了许多组合。 我不确定为什么自由不提供客户端实现类.. 你可以尝试通过maven pom.xml包括jersey-client ..
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.23.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.6.1</version>
</dependency>
在Server.xml中删除功能
<feature>jaxrs-2.0</feature>
<feature>jaxrsClient-2.0</feature>
并添加以下功能。
<feature>beanValidation-1.1</feature>
答案 1 :(得分:0)
Liberty IS 提供客户端实现,但parentLast类加载器委派阻止它被使用。
似乎MobileFirst正在打包Jersey,在这种情况下,应禁用Liberty的JAX-RS功能,以便使用Jersey。这可能需要您更改maven / gradle工件中声明依赖项的方式。
答案 2 :(得分:0)
Suresh的解决方案奏效了。我只需要在我的pom.xml中添加更多依赖项。我认为我不需要Moxy ..将进一步优化。
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-core</artifactId>
<version>2.5.0-b61</version>
</dependency>
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-api</artifactId>
<version>2.5.0-b42</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.moxy</artifactId>
<version>2.6.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>