Apache Spark не играет хорошо с инъекцией зависимости Джерси

Я пытаюсь использовать com.github.sps.metrics.metrics-opentsdbбиблиотеку для регистрации метрик из задания spark на сервер OpenTSDB. Я сталкиваюсь с проблемой, где я получаю странный NPE в коде Джерси, который имеет дело с EncodingFilters.

Вот исключение, которое я получаю:

ERROR OpenTsdb: send to opentsdb endpoint failed
javax.ws.rs.ProcessingException: java.lang.NullPointerException
    at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:582)
    at org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:564)
    at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1148)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1098)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
    at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
    at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:428)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1635)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1630)
    at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.post(WebClient.java:1570)
    at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.post(InvocationBuilderImpl.java:145)
    at com.github.sps.metrics.opentsdb.OpenTsdb.sendHelper(OpenTsdb.java:176)
    at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:162)
    at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:138)
    at com.adobe.gto.gateway.common.metrics.Metrics$RunnableMetricRecorder.run(Metrics.java:220)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at org.glassfish.jersey.client.filter.EncodingFilter.getSupportedEncodings(EncodingFilter.java:110)
    at org.glassfish.jersey.client.filter.EncodingFilter.filter(EncodingFilter.java:84)
    at org.apache.cxf.jaxrs.client.spec.ClientRequestFilterInterceptor.handleMessage(ClientRequestFilterInterceptor.java:60)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:652)
    at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1097)`

Я посмотрел код в EncodingFilter.класс и увидеть, что линия я проваливаюсь на это:

List<ContentEncoder> encoders = serviceLocator.getAllServices(ContentEncoder.class);

В классе я вижу, что serviceLocator не является экземпляром, вместо этого я вижу эту строку в верхней части класса:

@Inject
private ServiceLocator serviceLocator;

Я изначально думал, что это может быть плохая зависимость, поэтому я проверил my mvn dependency:treeи убедился, что все версии для проектов cxf и jersey совпадают, поэтому я не думаю, что это проблема. Теперь я думаю, что это имеет какое-то отношение к Apache Spark, причина, по которой я думаю, что это потому, что у меня есть отдельное приложение, которое использует ту же metrics-opentsdbбиблиотеку, и я никогда не вижу вышеупомянутого исключения, все работает правильно в моем другом приложении.

Итак, кто-нибудь знает, что происходит с инъекцией зависимости Джерси и spark? Кто-нибудь занимался этой же проблемой и исправил ее? Является ли проблема чем-то совершенно другим?

1 ответ

  1. Сотрудник отметил, что CXF и Джерси являются конкурирующими продуктами, и предложил удалить CXF, так metrics-opentsdbкак библиотека говорит, что он использует Джерси.
    Поэтому я переписал часть своего приложения, которое использовало CXF, и добавил <exclusions>раздел к одной из своих зависимостей в mypom.xml, и теперь все, кажется, работает хорошо.