#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
. Конечно, он также может быть аннотирован чем-то другим.