使用 MarkLogic Java API 时,任何其他尝试使用 jersey 客户端的代码都会加载 MarkLogic 包的 MockRuntimeDelegate 类,从而导致 NPE。
ML pom:
<dependency>
<groupId>com.marklogic</groupId>
<artifactId>marklogic-client-api</artifactId>
<version>4.0.3</version>
</dependency>
jersey 客户端使用(Scala 代码):
val webResource: WebResource = Client.create(new DefaultClientConfig(classOf[MultiPartWriter])).resource(ROOT_URL)
异常(exception):
←[31m java.lang.ExceptionInInitializerError:←[0m
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBod
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBod
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.init(MessageBodyFactor
←[31m at com.sun.jersey.api.client.Client.init(Client.java:343)←[0m
←[31m at com.sun.jersey.api.client.Client.access$000(Client.java:119)←[0m
←[31m at com.sun.jersey.api.client.Client$1.f(Client.java:192)←[0m
←[31m at com.sun.jersey.api.client.Client$1.f(Client.java:188)←[0m
←[31m at
com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)←[0m
←[31m at com.sun.jersey.api.client.Client.<init>(Client.java:188)←[0m
←[31m at com.sun.jersey.api.client.Client.<init>(Client.java:171)←[0m
←[31m ...←[0m
←[31m Cause: java.lang.NullPointerException:←[0m
←[31m at javax.ws.rs.core.MediaType.valueOf(MediaType.java:196)←[0m
←[31m at com.sun.jersey.core.header.MediaTypes.<clinit>
(MediaTypes.java:65)←[0m
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBod
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.initReaders(MessageBod
←[31m at
com.sun.jersey.core.spi.factory.MessageBodyFactory.init(MessageBodyFactor
←[31m at com.sun.jersey.api.client.Client.init(Client.java:343)←[0m
←[31m at com.sun.jersey.api.client.Client.access$000(Client.java:119)←[0m
←[31m at com.sun.jersey.api.client.Client$1.f(Client.java:192)←[0m
←[31m at com.sun.jersey.api.client.Client$1.f(Client.java:188)←[0m
←[31m at
com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:193)←[0m
此异常是因为 MockRuntimeDelegate 中的 MarkLogic 实现对于 createHeaderDelegate()
的任何使用都会返回 null。
由于此类位于类路径中 - 任何其他尝试使用 simple jersey 客户端都会导致此错误。
原因是 Jersey 代码正在使用类加载器来查找 RuntimeDelegate 的任何实现,而 MarkLogic 是类路径中的第一个(在 RuntimeDelegateImpl Jersey 包类的正确实现之前)
我发现的唯一解决方案是在客户端代码之前显式设置 RuntimeDelegete 类:
RuntimeDelegate.setInstance(new RuntimeDelegateImpl)
有没有更优雅的方法来解决这个问题?
最佳答案
目前您的做法是正确的。我在 Marklogic Java Client API 中创建了一个任务,用于删除 RuntimeDelegate 的模拟实现。您可以在此处跟踪进度 - https://github.com/marklogic/java-client-api/issues/892
关于java - MarkLogic Java API 覆盖 Jersey RuntimeDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48682836/