You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:02:41