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

如何启动带CDI特性的Helidon 4.0 SE服务器?依赖及启动配置解析

启动带CDI特性的Helidon 4.0 SE服务器

所需依赖添加

要在Helidon 4.0 SE中启用CDI,需添加以下Maven依赖(Gradle可对应转换):

<!-- Helidon SE CDI集成核心依赖 -->
<dependency>
    <groupId>io.helidon.integrations.cdi</groupId>
    <artifactId>helidon-integrations-cdi-se</artifactId>
    <version>4.0.0</version>
</dependency>
<!-- CDI API 依赖(若项目未间接引入) -->
<dependency>
    <groupId>jakarta.enterprise</groupId>
    <artifactId>jakarta.enterprise.cdi-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

若需要完整CDI容器实现(如Weld),可额外添加:

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se-core</artifactId>
    <version>5.1.2.Final</version>
</dependency>

应用启动阶段的变更

Helidon SE默认不加载CDI容器,需在启动代码中显式初始化并集成到WebServer:

  1. 初始化CDI容器并启动服务器
import io.helidon.integrations.cdi.se.CdiExtension;
import io.helidon.webserver.WebServer;
import jakarta.enterprise.inject.se.SeContainer;
import jakarta.enterprise.inject.se.SeContainerInitializer;

public class Main {
    public static void main(String[] args) {
        // 初始化CDI容器,注册Helidon SE扩展
        SeContainerInitializer initializer = SeContainerInitializer.newInstance()
                .addExtensions(new CdiExtension());
        
        try (SeContainer container = initializer.initialize()) {
            // 从CDI容器获取已配置的WebServer实例并启动
            WebServer server = container.select(WebServer.class).get();
            server.start().await();
            System.out.println("Server running at: " + server.baseUri());
        }
    }
}
  1. 直接构建WebServer时集成CDI
WebServer server = WebServer.builder()
        .addExtension(new CdiExtension())
        .addService(container.select(HelloService.class).get()) // 从CDI获取业务Bean
        .build()
        .start()
        .await();

加载作用域Bean

要让CDI作用域Bean(如@ApplicationScoped、@RequestScoped)正常加载使用:

  • 给Bean类标注CDI作用域注解:
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class HelloService {
    public String greet(String name) {
        return "Hello, " + name + "!";
    }
}
  • 通过@Inject注入到其他CDI管理的类中,或直接从容器获取:
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;

@Path("/greet")
public class GreetResource {
    private final HelloService helloService;

    @Inject
    public GreetResource(HelloService helloService) {
        this.helloService = helloService;
    }

    @GET
    public String getGreeting(@QueryParam("name") String name) {
        return helloService.greet(name);
    }
}
  • 若Bean不在默认扫描路径下,需初始化容器时指定扫描包:
initializer.scanPackages("com.your.app.package");

内容的提问来源于stack exchange,提问作者himanshu_mps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:41:18