Почему Quarkus не сканирует компоненты JakartaEE?

#java #jakarta-ee #java-ee-7 #quarkus

#java #джакарта-ee #java-ee-7 #quarkus

Вопрос:

Я работаю над миграцией из приложения JavaEE / JakartaEE (v. 7.0), развернутого на JBoss, в Quarkus.

Я удалил все зависимости JEE и JBoss и заменил их зависимостями Quarkus. Теперь, когда я запускаю приложение с помощью команды: mvn compile quarkus:dev , указанной в документации Quarkus, я получаю много ошибок, подобных следующей:

 [1] Unsatisfied dependency for type com.freesoft.diba.jeeop.cert_proxy.acme.database.NonceRepository and qualifiers [@Default]
[ERROR]         - java member: com.freesoft.diba.jeeop.cert_proxy.acme.AcmeProtocolFeature#nonceRepository
[ERROR]         - declared on CLASS bean [types=[java.lang.Object, com.freesoft.diba.jeeop.cert_proxy.acme.AcmeProtocolFeature], qualifiers=[@Default, @Any], target=com.freesoft.diba.jeeop.cert_proxy.acme.AcmeProtocolFeature] 
  

Класс AcmeProtocolFeature следующий:

 @Provider
public class AcmeProtocolFeature implements DynamicFeature {

    @Inject
    Logger logger;
    @Inject
    PolicyHandler policyHandler;
    @Inject
    NonceRepository nonceRepository
    [...]
  

Класс NonceRepository следующий:

 public class NonceRepository {

    @Inject
    @PersistenceContext(unitName = "acme")
    EntityManager em;
  

В предыдущей версии (JEE) приложения все работало просто хорошо. Мне интересно, почему это больше не работает так, как ожидалось, потому что, насколько я знаю, Quarkus реализует все стандарты JavaEE / JakartaEE ?!

Ответ №1:

Как указано в документации Quarkus, классы, у которых нет аннотации, определяющей компонент, не обнаружены.

Классы компонентов, у которых нет аннотации, определяющей компонент, не обнаружены. Это поведение определяется CDI. Но методы и поля производителя и методы наблюдателя обнаруживаются, даже если объявляющий класс не снабжен аннотацией, определяющей компонент (это поведение отличается от того, что определено в CDI)

В JavaEE / JakartaEE, если в классе не указана какая-либо аннотация, определяющая компонент, то по умолчанию она будет считаться аннотированной @Dependent , так что, по сути, именно поэтому версия приложения JavaEE / JakartaEE работала хорошо, а версия Quarkus не работала вообще.

Решением было бы явно указать аннотацию, определяющую компонент, поверх каждого класса, который вы хотите внедрить дальше, в частности, в этом сценарии класс NonceRepository должен быть аннотирован по крайней мере @Dependent аннотацией.

Комментарии:

1. Именно это. Но, учитывая, что это выглядит как Repository , @ApplicationScoped вероятно, было бы лучше.

2. Перед переходом на Quarkus не было предоставлено аннотации к компоненту, поэтому я подумал, что в обсуждении было @Dependent . Конечно, он также может быть аннотирован чем-то другим.