如果我使用以下 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/