Джерси: «Возвращаемся к клиенту без инъекций»

Я переносю зависимости, имеющиеся у меня от старой тестовой программы, на последние версии. Одной из таких зависимостей является jersey-client, версию которого я обновил до 3.1.6, которая на момент написания статьи является последней выпущенной версией.

Когда я запускаю код, я получаю следующее предупреждение в журналах приложения:

org.glassfish.jersey.client.innate.inject.NonInjectionManager <init>
WARNING: Falling back to injection-less client.

Это сообщение пишется каждый раз, когда я делаю вызов REST, независимо от типа вызова (GET, PUT, POST, DELETE и т. д.).

Очевидно, Джерси пытается сказать мне что-то, что считает важным, но неясно, в чем проблема и что мне следует с этим делать. Я попытался найти в предупреждающем сообщении некоторую документацию по этой проблеме; одна поисковая система выдала только 6 совпадений (ни одно из которых не было полезным), другая вообще не нашла ни одного совпадения.

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

Кто-нибудь знает, о чем идет речь в этом сообщении и как его исправить?

Человеку, проголосовавшему за закрытие: не могли бы вы сказать мне, что вы хотите, чтобы я разъяснил?

Stormcloud 29.04.2024 18:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
407
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я также думаю, что поведение плохо документировано, но кажется, что Джерси хотел бы использовать фабрику инъекций. После добавления менеджера инъекций Джерси

        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
        </dependency>

как зависимость, сообщение исчезло.

Я не знаю, в чем именно преимущество, но, возможно, вы можете интегрировать конфигурации трикотажа или, например, фильтр журналирования через инъекцию.

Спасибо - все сработало отлично. Интересно, как вы узнали об этой зависимости?

Stormcloud 03.05.2024 16:24

Я правда этого не помню. Я, наверное, погуглил трикотаж и инъекцию, а затем нашел ссылку на HK2.

Isabelle R. 18.06.2024 09:43

Ответ Изабель правильный.

Небольшое пояснение: если HK2 не находится на пути к классам, Джерси завершится ошибкой с исключением. Вместо этого в качестве запасного варианта используется клиент без внедрения. Этот подход хорошо работает для клиентов, которые не используют внедрение (@Context) в классы, зарегистрированные в этих клиентах (например, в ClientRequestFilter).

В некоторых сценариях может потребоваться не зависеть от HK2 (когда он не нужен), чтобы минимизировать нагрузку на приложение или микросервис.

Некоторые люди жалуются на время загрузки клиента Джерси, прежде чем можно будет отправить первый запрос. Без HK2 время сокращается примерно вдвое.

Еще одним требованием будет зависимость от чистого внедрения CDI, которое, возможно, появится в Jakarta REST 5.0 (я знаю, что за много лет до этого это было отложено из недавней Jakarta REST 4.0). Однако, в отличие от HK2, здесь существует только одна среда выполнения CDI для нескольких клиентов, а компоненты CDI, относящиеся к каждому клиенту, не изолированы от других клиентов. Таким образом, одним из подходов может быть использование клиентов без инъекций.

Когда HK2 отсутствует, клиент печатает предупреждение о нефункциональном внедрении в клиенте. Если это намеренно, предупреждение можно отключить, включив

 <dependency>
     <groupId>org.glassfish.jersey.incubator</groupId>
     <artifactId>jersey-injectless-client</artifactId>
 </dependency>

Фактически, включив это, Джерси выбирает клиента без внедрения независимо от того, находится ли HK2 в пути к классам или нет. Как видите, это все еще инкубационная функция.

Другие вопросы по теме