Ошибка при использовании jersey-client в osgi - Генератор не был предоставлен

Я получаю следующее исключение, когда пытаюсь создать WebTarget из клиента Джерси.

Мой код

Client client = ClientBuilder.newClient();
WebTarget baseTarget = client.target("http://127.0.0.1:9000");

Трассировка стека исключений

java.lang.IllegalStateException: No generator was provided
and there is no default generator registered
    at    org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.internalCreate(ServiceLocatorFactoryImpl.java:266)
    at org.glassfish.hk2.internal.ServiceLocatorFactoryImpl.create(ServiceLocatorFactoryImpl.java:247)
    at org.glassfish.jersey.internal.inject.Injections._createLocator(Injections.java:138)
    at org.glassfish.jersey.internal.inject.Injections.createLocator(Injections.java:109)
    at org.glassfish.jersey.internal.RuntimeDelegateImpl.<init>(RuntimeDelegateImpl.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:374)
    at javax.ws.rs.ext.FactoryFinder.newInstance(FactoryFinder.java:118)
    at javax.ws.rs.ext.FactoryFinder.find(FactoryFinder.java:225)
    at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:135)
    at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:120)
    at javax.ws.rs.core.UriBuilder.newInstance(UriBuilder.java:95)
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at org.glassfish.jersey.client.JerseyWebTarget.<init>(JerseyWebTarget.java:71)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:185)
    at org.glassfish.jersey.client.JerseyClient.target(JerseyClient.java:70)

В чем может быть проблема ?


person jubi    schedule 09.09.2014    source источник
comment
Другая причина (в моем случае), по которой эта проблема может возникнуть, заключается в том, что кто-то пытается переместить пакеты org.glassfish во время затенения, как указано здесь github.com/KostyaSha/docker-java-shade/issues/1 Чтобы процитировать оттуда: «Класс org.glassfish.hk2.extension.ServiceLocatorGenerator перемещается в shadow1. org.glassfish.hk2.extension.ServiceLocatorGenerator, но в файле META-INF/services/org.glassfish.hk2.extension.ServiceLocatorGenerator этого нет, поэтому реализацию невозможно найти».   -  person Deven    schedule 29.07.2019


Ответы (4)


Добавьте следующие архивы из каталога Jersey-ext-directory в путь к классам:

hk2-api-*.jar

hk2-локатор-*.jar

hk2-utils-*.jar

javax-внедрить-*.jar

джерси-гуава-*.jar

person sinclair    schedule 25.09.2014
comment
У меня такая же проблема, и все эти jar-файлы находятся в моем пути к классам, но я все еще получаю исключение. Я также заметил следующее предупреждение: ПРЕДУПРЕЖДЕНИЕ: не удается найти реализацию HK2 ServiceLocatorGenerator по умолчанию. - person Petros P; 16.12.2014
comment
У меня возникла точно такая же проблема, и оказалось, что это конфликт банок. Итак, просто чтобы представить это в перспективе, моя среда выполнения - это OSGI, где она работала нормально, но когда я пытался выполнить клиент из трикотажа, используя простой класс java через Eclipse, он выдавал исключение. Решение сработало для меня: я удалил все зависимости пути к классам, которые использовались OSGI, и добавил библиотеки, упомянутые в этом ответе. Кроме того, мне пришлось добавить библиотеки Jersey Client и Jersey Common. Надеюсь, это поможет. Я бы хотел, чтобы дистрибутив трикотажных изделий просто объединял их, чтобы разработчикам не приходилось искать. - person MG Developer; 07.05.2015
comment
Я забыл hk2-locator-*.jar, что вызвало указанную выше ошибку. Когда добавил, моя проблема решена. - person Yergalem; 06.06.2017
comment
@sinclair, что вы подразумеваете под hk2-api-*.jar? У вас все банки начинаются с hk2-api? - person Deven; 28.07.2019
comment
@Deven hk2-api-‹version›.jar, например. hk2-api-2.5.0.jar - person sinclair; 29.07.2019

Зарегистрируйте hk2-locator и javassist как пакеты в вашей среде OSGi.

Джерси использует hk2-locator для поиска сервисов в OSGi.

person Alexandre Sousa    schedule 10.10.2014

У меня была такая же проблема, и я смог, наконец, решить ее, запустив свой пакет, который использует Джерси для публикации конечной точки на уровне 2 в Felix Framework (OSGi-5.4). Я не уверен, почему, но похоже на зависимости HK2-Locator:

  • hk2-api-2.4.0-b10.jar -> Уровень 1
  • hk2-locator-2.4.0-b10.jar -> Уровень 1
  • hk2-utils-2.4.0-b10.jar -> Уровень 1
  • org.apache.servicemix.bundles.javax-inject-1_2.jar -> Уровень 1
  • джерси-гуава-2.22.1.jar -> Уровень 1

нужно начинать сначала перед пакетом, который их использует:

  • your-bundle-1.0.0.jar -> Уровень 2

После того, как вы настроите свой пакет для запуска на этом новом уровне, обязательно выполните frameworklevel 2 в консоли Felix, чтобы запустить пакеты на этом уровне. Перезапустите фреймворк и все заработает.

person Joe Almore    schedule 07.12.2015
comment
Это исправило проблему для меня в Феликсе. - person Adrian Baker; 31.08.2016

У меня была эта проблема в Weblogic. Реализацию по умолчанию можно найти внутри файла jar: hk2-locator.jar: org.jvnet.hk2.external.generator.ServiceLocatorGeneratorImpl.

Проблема в том, что этот файл jar содержит пакеты таким образом: org.jvnet... вместо другого: org.glassfish...

В случае Weblogic у меня была следующая конфигурация в weblogic.xml:

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>javax.ws.rs.*</wls:package-name>
        <wls:package-name>org.glassfish.jersey.*</wls:package-name>
        <wls:package-name>org.glassfish.hk2.*</wls:package-name>
    </wls:prefer-application-packages>
</wls:container-descriptor>

Поэтому мне пришлось добавить новую запись:

<wls:package-name>org.jvnet.*</wls:package-name>
person ravenskater    schedule 25.06.2020