为什么 Quarkus 不扫描 JakartaEE bean?
Why Quarkus doesn't scan JakartaEE beans?
我正在将部署在 JBoss 上的 JavaEE/JakartaEE (v. 7.0) 应用程序迁移到 Quarkus。
我删除了所有 JEE 和 JBoss 依赖项,并将它们替换为 Quarkus 依赖项。现在,当我使用 Quarkus 文档中指定的命令 mvn compile quarkus:dev
启动应用程序时,我收到了很多错误,如下所示:
[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]
classAcmeProtocolFeature
是下面那个:
@Provider
public class AcmeProtocolFeature implements DynamicFeature {
@Inject
Logger logger;
@Inject
PolicyHandler policyHandler;
@Inject
NonceRepository nonceRepository
[...]
classNonceRepository
是下面的那个:
public class NonceRepository {
@Inject
@PersistenceContext(unitName = "acme")
EntityManager em;
在应用程序的先前版本(JEE 版本)中,一切都运行良好。我想知道为什么这不再像预期的那样工作,因为据我所知,Quarkus 实现了所有 JavaEE/JakartaEE 标准?!
如 Quarkus documentation 中所述,未发现没有 bean 定义注释的 classes。
Bean classes that don’t have a bean defining annotation are not discovered. This behavior is defined by CDI. But producer methods and fields and observer methods are discovered even if the declaring class is not annotated with a bean defining annotation (this behavior is different to what is defined in CDI)
在JavaEE/JakartaEE中,如果class没有指定任何bean定义注解,那么默认情况下会认为它被注解为@Dependent
,所以基本上,这就是为什么JavaEE/JakartaEE 版本的应用程序运行良好,而 Quarkus 版本根本无法运行。
解决方案是在要进一步注入的每个 class 之上显式指定一个 bean 定义注释,特别是在这种情况下,class NonceRepository
应该是至少用 @Dependent
注释进行注释。
我正在将部署在 JBoss 上的 JavaEE/JakartaEE (v. 7.0) 应用程序迁移到 Quarkus。
我删除了所有 JEE 和 JBoss 依赖项,并将它们替换为 Quarkus 依赖项。现在,当我使用 Quarkus 文档中指定的命令 mvn compile quarkus:dev
启动应用程序时,我收到了很多错误,如下所示:
[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]
classAcmeProtocolFeature
是下面那个:
@Provider
public class AcmeProtocolFeature implements DynamicFeature {
@Inject
Logger logger;
@Inject
PolicyHandler policyHandler;
@Inject
NonceRepository nonceRepository
[...]
classNonceRepository
是下面的那个:
public class NonceRepository {
@Inject
@PersistenceContext(unitName = "acme")
EntityManager em;
在应用程序的先前版本(JEE 版本)中,一切都运行良好。我想知道为什么这不再像预期的那样工作,因为据我所知,Quarkus 实现了所有 JavaEE/JakartaEE 标准?!
如 Quarkus documentation 中所述,未发现没有 bean 定义注释的 classes。
Bean classes that don’t have a bean defining annotation are not discovered. This behavior is defined by CDI. But producer methods and fields and observer methods are discovered even if the declaring class is not annotated with a bean defining annotation (this behavior is different to what is defined in CDI)
在JavaEE/JakartaEE中,如果class没有指定任何bean定义注解,那么默认情况下会认为它被注解为@Dependent
,所以基本上,这就是为什么JavaEE/JakartaEE 版本的应用程序运行良好,而 Quarkus 版本根本无法运行。
解决方案是在要进一步注入的每个 class 之上显式指定一个 bean 定义注释,特别是在这种情况下,class NonceRepository
应该是至少用 @Dependent
注释进行注释。