Я пытаюсь использовать библиотеку 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
, и я никогда не вижу вышеперечисленного исключения, все работает правильно в моем другом приложении.
Итак, кто-нибудь знает, что происходит с инъекцией и искровой зависимостью от Джерси? Кто-нибудь имел дело с этой же проблемой и исправил ее? Проблема в чем-то совсем другом?
Вы упаковываете свое приложение в «толстую банку» (используя плагин Maven/Gradle for shadowing)? Если это так - проблема, вероятно, в переопределении служебных файлов. –
@TzachZohar, я использую плагин maven's Shade, но у меня возникает проблема при запуске приложения в eclipse. У меня создалось впечатление, что при запуске в eclipse у меня не было бы проблемы с переопределением файлов. Разве это не так? – Hardy
Умм .. ты меня там, я бы предположил, что это тоже будет работать в Eclipse ... –