java - MarkLogic Java API 覆盖 Jersey RuntimeDelegate

标签 java marklogic jersey-client

使用 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/

相关文章:

java - 反转二叉树的交替级别

java - NoSuchElementException 是 ResourceNotFoundException 的一个很好的替代品吗?

java - 为每个客户端维护与 jersey CLIENT 的 cookie session

java - 框架中间的 JPanel

java - Switch 语句在嵌套类型中失败

xml - MarkLogic:使用 XQuery 将 XML 文档转换为 XML 字符串

node.js - MarkLogic node.js api - 按计数分组和排序

Marklogic 将空节点传递给 xquery 函数

java - Jersey 客户端发布表单数据

java - 如何使用 jersey 在 java 中发送嵌套 json POST 请求?