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

Spring生态是否实现SeContainerInitializer?能否整合Jakarta NoSQL Artemis?

Spring Boot整合Jakarta NoSQL Artemis的问题解答

1. Spring生态是否实现SeContainerInitializer/SeContainer?

Spring官方没有实现Jakarta EE规范中的SeContainerInitializer或SeContainer接口。Spring拥有独立的依赖注入体系,与Jakarta CDI属于平行的技术方案,官方暂无兼容Jakarta CDI核心接口的计划,且该现状预计会长期维持。

2. 能否在Spring Boot中使用Jakarta NoSQL Artemis?

可以使用,但需要手动整合CDI容器(如Weld)与Spring Boot,因为Artemis核心依赖Jakarta CDI进行Bean管理。以下是完整的简单示例:

步骤1:添加依赖(Maven)

<dependencies>
    <!-- Spring Boot核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- Jakarta NoSQL Artemis图数据库核心 -->
    <dependency>
        <groupId>org.eclipse.jnosql.artemis</groupId>
        <artifactId>artemis-graph</artifactId>
        <version>1.0.0</version>
    </dependency>

    <!-- Neo4j驱动(示例采用Neo4j作为图数据库) -->
    <dependency>
        <groupId>org.eclipse.jnosql.diana</groupId>
        <artifactId>diana-neo4j</artifactId>
        <version>1.0.0</version>
    </dependency>

    <!-- Weld CDI容器实现 -->
    <dependency>
        <groupId>org.jboss.weld.se</groupId>
        <artifactId>weld-se-core</artifactId>
        <version>5.1.0.Final</version>
    </dependency>
</dependencies>

步骤2:配置数据库连接(application.properties)

# Neo4j连接配置
jakarta.nosql.neo4j.uri=bolt://localhost:7687
jakarta.nosql.neo4j.user=neo4j
jakarta.nosql.neo4j.password=your-db-password

步骤3:整合CDI与Spring的配置类

import jakarta.nosql.mapping.graph.GraphTemplate;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JakartaNoSQLConfig {

    // 初始化Weld容器,扫描Artemis及自定义实体包
    @Bean(destroyMethod = "shutdown")
    public WeldContainer weldContainer() {
        Weld weld = new Weld();
        weld.addPackage(org.eclipse.jnosql.artemis.graph.GraphTemplate.class.getPackage());
        weld.addPackage(com.example.demo.entity.Person.class.getPackage()); // 替换为你的实体包路径
        return weld.initialize();
    }

    // 将CDI管理的GraphTemplate注册为Spring Bean
    @Bean
    public GraphTemplate graphTemplate(WeldContainer weldContainer) {
        return weldContainer.select(GraphTemplate.class).get();
    }
}

步骤4:定义实体类

import jakarta.nosql.mapping.Column;
import jakarta.nosql.mapping.Entity;
import jakarta.nosql.mapping.Id;

@Entity("Person")
public class Person {

    @Id
    private String id;

    @Column("name")
    private String name;

    @Column("age")
    private int age;

    // 无参构造、全参构造、Getter/Setter
    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter和Setter省略
}

步骤5:业务服务实现

import jakarta.nosql.mapping.graph.GraphTemplate;
import org.springframework.stereotype.Service;
import java.util.Optional;

@Service
public class PersonService {

    private final GraphTemplate graphTemplate;

    // 注入Spring管理的GraphTemplate
    public PersonService(GraphTemplate graphTemplate) {
        this.graphTemplate = graphTemplate;
    }

    // 新增实体
    public Person save(Person person) {
        return graphTemplate.insert(person);
    }

    // 根据ID查询
    public Optional<Person> findById(String id) {
        return graphTemplate.find(Person.class, id);
    }
}

步骤6:测试运行

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner implements CommandLineRunner {

    private final PersonService personService;

    public AppRunner(PersonService personService) {
        this.personService = personService;
    }

    @Override
    public void run(String... args) {
        // 新增数据
        Person alice = new Person("Alice", 30);
        Person saved = personService.save(alice);
        System.out.println("已保存用户:" + saved.getName());

        // 查询数据
        personService.findById(saved.getId()).ifPresent(p -> 
            System.out.println("查询到用户:" + p.getName())
        );
    }
}

异常原因说明

你用@Inject注入GraphTemplate时Spring找不到Bean,核心原因是:

  • Spring的依赖注入只会识别自身容器管理的Bean,而Artemis的核心Bean默认由CDI容器初始化;
  • 必须通过上述配置,将CDI管理的Artemis Bean手动注册到Spring容器,才能被Spring的DI机制识别。

3. 现状与未来规划

  • 当前Spring官方仍无实现Jakarta CDI核心接口的计划,Spring DI与Jakarta CDI将保持平行独立的状态;
  • 这种现状并非临时情况,而是Spring生态的长期定位——专注于自身DI体系,不兼容Jakarta CDI的核心接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:30