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

Microstream集成Micronaut应用异常:存储目录未生成且REST端点无法访问

排查Micronaut 3.9.3整合Microstream的存储目录与UI端点问题

1. 检查Microstream依赖配置

确保构建文件中引入了正确的依赖组合,Micronaut 3.x需搭配对应版本的Microstream集成包:

  • Gradle示例:
implementation("io.micronaut.microstream:micronaut-microstream-storage")
implementation("io.micronaut.microstream:micronaut-microstream-rest") // 用于UI端点支持
runtimeOnly("one.microstream:microstream-storage-embedded")

确认依赖版本与Micronaut 3.9.3兼容,避免跨版本冲突。

2. 验证Microstream存储核心配置

检查application.yml中的存储配置,重点确认两个关键项:

microstream:
  storage:
    default:
      storage-directory: build/fruit-storage
      root-class: com.example.FruitStore # 必须指定根实体类,不能是单个Fruit实体

注意:Microstream需要一个根对象作为存储树的入口,仅定义Fruit实体无法触发存储目录初始化。

3. 实现根实体类与存储初始化

创建根实体类(如FruitStore),并通过工厂类初始化存储管理器:

import io.micronaut.context.annotation.Factory;
import one.microstream.storage.embedded.EmbeddedStorageManager;
import jakarta.inject.Singleton;

@Factory
public class StorageFactory {

    @Singleton
    public EmbeddedStorageManager embeddedStorageManager(EmbeddedStorageConfiguration configuration) {
        EmbeddedStorageManager manager = EmbeddedStorage.start(configuration);
        // 初始化根对象(首次启动时)
        if (manager.root() == null) {
            manager.setRoot(new FruitStore());
            manager.storeRoot();
        }
        return manager;
    }
}

根实体类示例:

import java.util.ArrayList;
import java.util.List;

public class FruitStore {
    private List<Fruit> fruits = new ArrayList<>();

    // getter/setter方法
}

只有根对象被初始化并存储后,Microstream才会创建指定的存储目录。

4. 检查安全拦截规则

若配置了Micronaut安全规则,确保Microstream的REST端点(默认路径/microstream/**)被放行:

micronaut:
  security:
    intercept-url-map:
      - pattern: /microstream/**
        access: isAnonymous() # 或根据需求配置对应权限

安全规则拦截该路径会直接导致UI客户端无法访问端点。

5. 触发存储操作

启动应用后,必须执行至少一次存储操作(比如保存一个Fruit实例到根对象),才会触发Microstream写入磁盘并创建存储目录:

import jakarta.inject.Inject;
import one.microstream.storage.embedded.EmbeddedStorageManager;

@Controller("/fruits")
public class FruitController {

    @Inject
    EmbeddedStorageManager storageManager;

    @Post
    public Fruit save(@Body Fruit fruit) {
        FruitStore store = (FruitStore) storageManager.root();
        store.getFruits().add(fruit);
        storageManager.store(store.getFruits()); // 显式触发存储
        return fruit;
    }
}

仅启动应用不执行存储操作,Microstream不会主动创建存储目录。

6. 验证Microstream UI端点

确认micronaut-microstream-rest依赖已正确引入,启动应用后访问http://localhost:8080/microstream:

  • 返回JSON数据表示端点正常
  • 若返回404,检查依赖是否缺失、安全规则是否拦截、应用是否扫描到Microstream的REST控制器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:11