Почему включение cxf-rt-rs-client прерывает обработку jersey-media-json - PullRequest
0 голосов
/ 30 июня 2018

Если я создаю проект 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>

Я могу вызвать метод getJson с помощью «http://api.plos.org/search?q=title:%22Drosophila%22%20and%20body:%22RNA%22&fl=id,abstract&wt=json&indent=on" (или любой конечной точки http, возвращающей JSON), и все работает как положено.

Такое поведение может быть продемонстрировано следующим образом

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.

Примечание: это упрощенный случай того, что на самом деле происходит. Я полагаюсь на две библиотеки, каждая из которых, где-то в цепочке зависимостей, соответственно зависит от каждой из этих зависимостей.

1 Ответ

0 голосов
/ 04 июля 2018

Вам нужно добавить следующий трансформатор в ваш плагин 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 ("Content-type", "application / json")

для приведенного выше примера URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...