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
相关产品推荐
相关产品推荐

