java - 为什么包含 cxf-rt-rs-client 会破坏 jersey-media-json-processing

标签 java maven cxf dependency-management jersey-client

如果我使用以下 App 类创建一个 Java (Maven) 项目(称为 com.example.lib)

package com.example.lib;

import javax.json.JsonObject;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class App 
{

    public String getJson(String url) {
        Client client = ClientBuilder.newClient();
        Response response = client.target( url )
                .request(MediaType.APPLICATION_JSON_TYPE)
                .get();
        if (response.getStatus() != 200) {
            System.exit(1);
        }
        return response.readEntity( JsonObject.class ).toString();
    }

    public static void main( String[] args )
    {
        System.out.println(new App().getJson(args[0]));
    }
}

以及 pom.xml 中的以下依赖项

<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>2.22.2</version>
</dependency>

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-processing</artifactId>
    <version>2.22.2</version>
</dependency>

我可以使用“http://api.plos.org/search?q=title:%22Drosophila%22%20and%20body:%22RNA%22&fl=id,abstract&wt=json&indent=on ”(或任何返回 JSON 的 http 端点)调用 getJson 方法,一切都会按预期工作。

此行为可以如下所示

mvn clean package
java -jar target/my-lib-1.0-SNAPSHOT-run.jar "http://api.plos.org/search?q=title:%22Drosophila%22%20and%20body:%22RNA%22&fl=id,abstract&wt=json&indent=on"

如果我添加以下依赖项

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-rs-client</artifactId>
    <version>3.0.3</version>
</dependency>

并且不执行任何其他操作,然后在调用电话时出现以下错误

Exception in thread "main" java.lang.NullPointerException
    at org.apache.cxf.jaxrs.client.AbstractClient.setupOutInterceptorChain(AbstractClient.java:847)
    at org.apache.cxf.jaxrs.client.AbstractClient.createMessage(AbstractClient.java:924)
    at org.apache.cxf.jaxrs.client.WebClient.finalizeMessage(WebClient.java:1109)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1082)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:883)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:854)
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:417)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1609)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1604)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.get(WebClient.java:1524)
    at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.get(InvocationBuilderImpl.java:80)
    at com.example.lib.App.getJson(App.java:21)
    at com.example.lib.App.main(App.java:30)

为什么会发生这种情况?

我该如何解决这个问题?

有一个项目在 https://github.com/HughPowell/my-lib 演示了这一点.

注意:这是实际发生情况的简化情况。我依赖于两个库,它们各自位于依赖链下游的某个位置,分别依赖于这些依赖项中的每一个。

最佳答案

您需要将以下转换器添加到您的 Maven Shade 插件中:

<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
    <resource>META-INF/cxf/bus-extensions.txt</resource>
</transformer>

请参阅此处的说明:

http://cxf.apache.org/docs/bundling-cxf-into-single-jar-with-maven-shade-plugin.html

另请注意,您的客户端代码将会失败 - 您需要添加:

.header("内容类型", "application/json")

对于您上面给出的示例 URL。

关于java - 为什么包含 cxf-rt-rs-client 会破坏 jersey-media-json-processing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51114036/

相关文章:

java - 如何仅使用自定义命令执行 maven-plugin?

java - 如何添加正则表达式来匹配字母数字字符和一些特殊字符

java - 关于静态方法和调用堆栈的问题

maven - 是否可以使用 Maven 属性来激活基于文件的配置文件?

java - 更新到最新版本后缺少 Artifact

当使用来自 bintray 的原型(prototype)时,Maven 报告 'The desired archetype does not exist'

web-services - Tomcat 没有启动我的网络服务

java - Guava -布隆过滤器 : is it possible to get a true-negative for a value that was **previously** a false-positive?

Java:覆盖子类中的抽象方法

java - JaxWsDynamicClientfactory + java.lang.RuntimeException : Cannot create a secure XMLInputFactory