如何在Quarkus CDI中使用不可修改的@Stateless注解类?
解决Quarkus中注入不可修改的@Stateless Bean问题
核心思路
Quarkus的AnnotationsTransformer只能通过Quarkus扩展的部署模块注册(普通应用无法直接使用BuildStep),我们需要创建一个极简扩展来注册转换器,将第三方类库中的@Stateless替换为Quarkus CDI能识别的@Dependent注解。
步骤1:创建Quarkus扩展(分两个模块)
Quarkus扩展通常包含runtime和deployment两个子模块,这里runtime模块无需额外业务代码,仅需配置依赖;核心转换逻辑在deployment模块实现。
1.1 运行时模块(stateless-transformer-runtime)
仅需编写pom.xml,声明基础依赖:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.yourgroup</groupId> <artifactId>stateless-transformer-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>stateless-transformer-runtime</artifactId> <name>Stateless Transformer Runtime</name> <dependencies> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-core</artifactId> </dependency> <dependency> <groupId>javax.ejb</groupId> <artifactId>javax.ejb-api</artifactId> <version>3.2.2</version> <scope>provided</scope> </dependency> </dependencies> </project>
1.2 部署模块(stateless-transformer-deployment)
1.2.1 添加依赖(pom.xml)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.yourgroup</groupId> <artifactId>stateless-transformer-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>stateless-transformer-deployment</artifactId> <name>Stateless Transformer Deployment</name> <dependencies> <dependency> <groupId>com.yourgroup</groupId> <artifactId>stateless-transformer-runtime</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-core-deployment</artifactId> </dependency> <dependency> <groupId>javax.ejb</groupId> <artifactId>javax.ejb-api</artifactId> <version>3.2.2</version> <scope>provided</scope> </dependency> </dependencies> </project>
1.2.2 实现AnnotationsTransformer
编写转换器,替换@Stateless为@Dependent:
package com.yourgroup.stateless.transformer.deployment; import io.quarkus.arc.processor.AnnotationsTransformer; import jakarta.enterprise.context.Dependent; import javax.ejb.Stateless; public class StatelessToDependentTransformer implements AnnotationsTransformer { @Override public boolean appliesTo(TransformationContext context) { // 仅处理带有@Stateless注解的类 return context.getTarget().isClass() && context.getAnnotations().hasAnnotation(Stateless.class); } @Override public void transform(TransformationContext context) { // 移除原有的@Stateless注解 context.getAnnotations().remove(Stateless.class); // 添加Quarkus CDI识别的@Dependent注解 context.getAnnotations().add(Dependent.class); } }
1.2.3 注册转换器的BuildStep
编写BuildStep类,将转换器注入Quarkus构建流程:
package com.yourgroup.stateless.transformer.deployment; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.AdditionalAnnotationsTransformerBuildItem; public class StatelessTransformerProcessor { @BuildStep AdditionalAnnotationsTransformerBuildItem registerTransformer() { return new AdditionalAnnotationsTransformerBuildItem(new StatelessToDependentTransformer()); } }
步骤2:在Quarkus应用中引入扩展
在你的Quarkus应用pom.xml中添加扩展依赖:
<dependency> <groupId>com.yourgroup</groupId> <artifactId>stateless-transformer-deployment</artifactId> <version>1.0-SNAPSHOT</version> <scope>provided</scope> </dependency>
步骤3:验证注入逻辑
你的原有应用代码无需修改,Quarkus构建时会自动将第三方类库中的@Stateless类转换为@Dependent类型的CDI Bean,此时MyServiceLocal即可正常注入使用。
额外说明
- 第三方Bean上的
@Local/@Remote注解会被Quarkus CDI自动识别为Bean的暴露类型,无需额外处理。 - 确保你的Quarkus应用已依赖
quarkus-arc(CDI核心依赖),多数Quarkus Starter项目默认已包含该依赖。
内容的提问来源于stack exchange,提问作者xuckz
相关产品推荐
相关产品推荐

