首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring配置中的微流EmbeddedStorageManager

spring配置中的微流EmbeddedStorageManager
EN

Stack Overflow用户
提问于 2021-06-06 15:19:09
回答 1查看 334关注 0票数 2

我想在春季引导应用程序(2.5.0)中将微流的EmbeddedStorageManager配置为bean。

代码语言:javascript
复制
@Configuration
public class MicrostreamConfig {

    @Value("${microstream.store.location}")
    String location;

    @Bean
    DataRoot dataRoot() {
        DataRoot dataRoot = new DataRoot();
        dataRoot.setProjectList(new ArrayList<>());
        return dataRoot;
    }
    
    @Bean
    public EmbeddedStorageManager storageManager() {

        EmbeddedStorageManager storageManager = EmbeddedStorage.start(
                dataRoot(),          // root object
                Paths.get(location) // storage directory
        );
        return storageManager;
    }
}

并将其注入存储库类中。

代码语言:javascript
复制
@Component
public class DataRepository {

    @Autowired
    private DataRoot dataRoot;

    @Autowired
    private EmbeddedStorageManager storageManager;

    public void addProject(Project project) {
        dataRoot.getProjectList().add(project);
        storageManager.storeAll(dataRoot.getProjectList());
    }

    public List<Project> getProjectList() {
        return dataRoot.getProjectList();
    }

    @PreDestroy
    public void onDestroy() throws Exception {
        storageManager.shutdown();
        log.info("Spring Container is destroyed!");
    }
}

DataRoot看起来像这样

代码语言:javascript
复制
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class DataRoot {
    private List<Project> projectList;
}

我可以启动应用程序,添加并列出我想要的项目。据我所知,由于存储文件大小的增加,项目已被保存。

因此,到目前为止,一切看起来都很好,直到我重新启动Spring应用程序

代码语言:javascript
复制
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [one.microstream.storage.types.EmbeddedStorageManager]: Factory method 'storageManager' threw exception; nested exception is one.microstream.exceptions.TypeCastException: Cannot cast ch.wesr.projectz.projapi.storage.DataRoot to ch.wesr.projectz.projapi.storage.DataRoot
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.7.jar:5.3.7]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.7.jar:5.3.7]
    ... 38 common frames omitted
Caused by: one.microstream.exceptions.TypeCastException: Cannot cast ch.wesr.projectz.projapi.storage.DataRoot to ch.wesr.projectz.projapi.storage.DataRoot
    at one.microstream.persistence.binary.internal.AbstractBinaryHandlerReflective.updateState(AbstractBinaryHandlerReflective.java:521) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.persistence.binary.internal.AbstractBinaryHandlerReflective.updateState(AbstractBinaryHandlerReflective.java:1) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.persistence.binary.types.BinaryLoader$Default.buildInstances(BinaryLoader.java:447) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.persistence.binary.types.BinaryLoader$Default.build(BinaryLoader.java:382) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.persistence.binary.types.BinaryLoader$Default.get(BinaryLoader.java:825) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.persistence.binary.types.BinaryLoader$Default.loadRoots(BinaryLoader.java:869) ~[persistence.binary-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorageManager$Default.loadExistingRoots(EmbeddedStorageManager.java:306) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorageManager$Default.initialize(EmbeddedStorageManager.java:326) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorageManager$Default.start(EmbeddedStorageManager.java:214) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorageManager$Default.start(EmbeddedStorageManager.java:1) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorage.createAndStartStorageManager(EmbeddedStorage.java:626) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at one.microstream.storage.types.EmbeddedStorage.start(EmbeddedStorage.java:484) ~[storage.embedded-04.01.00-MS-GA.jar:na]
    at ch.wesr.projectz.projapi.config.MicrostreamConfig.storageManager(MicrostreamConfig.java:33) ~[classes/:na]
    at ch.wesr.projectz.projapi.config.MicrostreamConfig$$EnhancerBySpringCGLIB$$d68ff25d.CGLIB$storageManager$1(<generated>) ~[classes/:na]
    at ch.wesr.projectz.projapi.config.MicrostreamConfig$$EnhancerBySpringCGLIB$$d68ff25d$$FastClassBySpringCGLIB$$586f2b14.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.7.jar:5.3.7]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.7.jar:5.3.7]
    at ch.wesr.projectz.projapi.config.MicrostreamConfig$$EnhancerBySpringCGLIB$$d68ff25d.storageManager(<generated>) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.7.jar:5.3.7]
    ... 39 common frames omitted
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 05:30:55

转换可能会失败,因为微流可能使用与春季引导应用程序不同的classLoader。您可以将Microstream配置为使用不同的线程,例如,当前线程的类加载器:

代码语言:javascript
复制
EmbeddedStorageManager storageManager = EmbeddedStorage.Foundation(Paths.get(location))
.onConnectionFoundation(cf -> cf.setClassLoaderProvider(ClassLoaderProvider.New(
    Thread.currentThread().getContextClassLoader())))
.start(dataRoot());

请参阅应用服务器中的类加载器

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67860686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档