2017-01-12 15 views
0

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

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

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.class и увидеть, что линия я не суметь на это:

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

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

@Inject 
private ServiceLocator serviceLocator; 

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

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

+0

Вы упаковываете свое приложение в «толстую банку» (используя плагин Maven/Gradle for shadowing)? Если это так - проблема, вероятно, в переопределении служебных файлов. –

+0

@TzachZohar, я использую плагин maven's Shade, но у меня возникает проблема при запуске приложения в eclipse. У меня создалось впечатление, что при запуске в eclipse у меня не было бы проблемы с переопределением файлов. Разве это не так? – Hardy

+0

Умм .. ты меня там, я бы предположил, что это тоже будет работать в Eclipse ... –

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^