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

Micronaut+EclipseStore环境下Root类类型处理器缺失异常求助

解决EclipseStore与Micronaut集成时的类型处理器缺失异常

问题场景

在Java 17环境下,使用Java Record结合Micronaut与EclipseStore开发,定义了如下Root类:

public class Root {
    private Map<UUID, Country> country = new HashMap<>();
    private Map<UUID, Prediction> prediction = new HashMap<>();
    private Map<UUID, UserMatchPoints> userMatchPoint = new HashMap<>();

    @NonNull
    public Map<UUID, Country> getCountry() {
        return this.country;
    }
    @NonNull
    public Map<UUID, Prediction> getPrediction() {
        return this.prediction;
    }
    @NonNull
    public Map<UUID, UserMatchPoints> getUserMatchPoint() {
        return this.userMatchPoint;
    }
}

相关Java Record定义:

public record Country(UUID id,
                      String name,
                      String shortName,
                      String url,
                      Optional<Integer> matchPlayed,
                      Optional<Integer> win,
                      Optional<Integer> draw,
                      Optional<Integer> lost,
                      Optional<Integer> points) {
}

public record Prediction(UUID id,
                         UUID matchId,
                         UUID winnerCountry,
                         WinningTime winningTime,
                         int firstTeamScore,
                         int secondTeamScore,
                         int penaltyFirstTeamScore,
                         int penaltySecondTeamScore,
                         UUID userId) {
}

Gradle配置:

tasks.withType<JavaExec> {
    jvmArgs("--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED")
}

启动时抛出异常:

ERROR i.m.http.server.RouteExecutor - Unexpected error occurred: Error instantiating bean of type  [io.micronaut.eclipsestore.DefaultRootProvider]

Caused by: org.eclipse.serializer.persistence.exceptions.PersistenceException: Missing runtime type for required type handler for type: fete.bird.entity.Root
    at org.eclipse.serializer.persistence.types.PersistenceTypeHandlerManager$Default.validateExistingType(PersistenceTypeHandlerManager.java:390)
    at org.eclipse.serializer.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandler(PersistenceTypeHandlerManager.java:439)
    at org.eclipse.serializer.persistence.types.PersistenceTypeHandlerManager$Default.lambda$ensureTypeHandlers$2(PersistenceTypeHandlerManager.java:486)
    at org.eclipse.serializer.collections.ChainStorageStrong.iterate(ChainStorageStrong.java:1316)
    at org.eclipse.serializer.collections.HashEnum.iterate(HashEnum.java:693)
    at org.eclipse.serializer.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandlers(PersistenceTypeHandlerManager.java:485)
    at org.eclipse.serializer.persistence.types.PersistenceTypeHandlerManager$Default.ensureTypeHandlersByTypeIds(PersistenceTypeHandlerManager.java:477)
    at org.eclipse.store.storage.embedded.types.EmbeddedStorageManager$Default.ensureRequiredTypeHandlers(EmbeddedStorageManager.java:344)
    at org.eclipse.store.storage.embedded.types.EmbeddedStorageManager$Default.start(EmbeddedStorageManager.java:251)
    at org.eclipse.store.storage.embedded.types.EmbeddedStorageManager$Default.start(EmbeddedStorageManager.java:95)
    at io.micronaut.eclipsestore.conf.StorageManagerFactory.createStorageManager(StorageManagerFactory.java:68)
    at io.micronaut.eclipsestore.conf.$StorageManagerFactory$CreateStorageManager0$Definition.doInstantiate(Unknown Source)
    at io.micronaut.context.AbstractInitializableBeanDefinition.instantiate(AbstractInitializableBeanDefinition.java:770)
    at io.micronaut.context.BeanDefinitionDelegate.instantiate(BeanDefinitionDelegate.java:156)
    at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2311)

问题原因

该异常核心原因是Root类未被正确标记为EclipseStore的持久化根对象,导致Micronaut集成时无法识别它,EclipseStore初始化阶段无法为其生成对应的序列化/反序列化类型处理器。

解决方案

1. 标记Root类为EclipseStore根对象

在Root类上添加Micronaut EclipseStore专属的@EclipseStoreRoot注解,明确告知框架这是持久化的根节点:

import io.micronaut.eclipsestore.annotation.EclipseStoreRoot;
import jakarta.validation.constraints.NonNull;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@EclipseStoreRoot
public class Root {
    private Map<UUID, Country> country = new HashMap<>();
    private Map<UUID, Prediction> prediction = new HashMap<>();
    private Map<UUID, UserMatchPoints> userMatchPoint = new HashMap<>();

    @NonNull
    public Map<UUID, Country> getCountry() {
        return this.country;
    }
    @NonNull
    public Map<UUID, Prediction> getPrediction() {
        return this.prediction;
    }
    @NonNull
    public Map<UUID, UserMatchPoints> getUserMatchPoint() {
        return this.userMatchPoint;
    }
}

2. 配置文件指定根类(可选,与注解二选一)

若不想使用注解,可在Micronaut配置文件(如src/main/resources/application.yml)中显式配置EclipseStore的根类:

eclipsestore:
  root-class: fete.bird.entity.Root

3. 确保关联类的可访问性

  • 确认Country、Prediction、UserMatchPoints均为public类,EclipseStore需要访问它们的类型信息
  • Java Record是EclipseStore原生支持的类型,无需额外配置序列化逻辑

4. 验证依赖与构建

  • 确保build.gradle中已引入必要的依赖:
    implementation("io.micronaut.eclipsestore:micronaut-eclipsestore")
    runtimeOnly("org.eclipse.store:eclipsestorage-embedded")
    
  • 执行./gradlew clean build清理缓存并重新构建,确保注解处理器正确生成配置文件

5. 保留必要的JVM参数

现有Gradle中的JVM参数是EclipseStore运行必需的,继续保留:

tasks.withType<JavaExec> {
    jvmArgs("--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED")
}

验证

重新启动应用,若不再抛出Missing runtime type for required type handler异常,说明配置生效,EclipseStore已成功识别Root类并生成对应的类型处理器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:50:05