spring bean 配置中的微流 EmbeddedStorageManager

我想在 Spring Boot 应用程序 (2.5.0) 中将 microstream 的 EmbeddedStorageManager 配置为 bean。

@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;
    }
}

并将其注入到存储库类中

@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 看起来像这样

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class DataRoot {
    private List<Project> projectList;
}

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

所以到目前为止一切似乎都很好,直到我重新启动 Spring 应用程序

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
xxxcs001 回答:spring bean 配置中的微流 EmbeddedStorageManager

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

EmbeddedStorageManager storageManager = EmbeddedStorage.Foundation(Paths.get(location))
.onConnectionFoundation(cf -> cf.setClassLoaderProvider(ClassLoaderProvider.New(
    Thread.currentThread().getContextClassLoader())))
.start(dataRoot());

Class Loader in Application Server

,

我改变了我的代码。

$

@Configuration
public class MicrostreamConfig {

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

    private DataRoot dataRoot;

    @Bean
    public EmbeddedStorageManager storageManager() {

        NioFileSystem fileSystem = NioFileSystem.New();
        EmbeddedStorageManager storageManager = EmbeddedStorage.Foundation(Paths.get(location))
                .onConnectionFoundation(cf -> cf.setClassLoaderProvider(ClassLoaderProvider.New(
                        Thread.currentThread().getContextClassLoader())))
                .start();


        if (storageManager.root() == null) {
            log.info("No database found  - creating a new one");
            DataRoot dataRoot = new DataRoot();
            storageManager.setRoot(dataRoot);
            dataRoot.getProjectList().add(new Project("return of the avatar","Avator","123d4-sdfaf-adf2K",new User("Ang","Avatar")));
            dataRoot.getProjectList().add(new Project("return of the jedi","Jedi","123d4-jedi-adf2K",new User("Master","Jedi")));
            dataRoot.setLocation(location);
            dataRoot.setContent("Avatar");
            storageManager.storeRoot();
        } else {
            DataRoot dataRoot = (DataRoot) storageManager.root();
            if (dataRoot != null) {
                log.info("Database found");
                log.info("location: " + dataRoot.getLocation());
                log.info("content: " + dataRoot.getContent());
                dataRoot.printAllMyProjects();
            } else {
                log.info("Where is my database?");
            }
        }
        log.info("storageManager: " + storageManager.toString());
        return storageManager;
    }

和存储库

@Component
public class DataRepository {

    @Autowired
    private EmbeddedStorageManager storageManager;

    public List<Project> addProject(Project project) {
        DataRoot dataRoot = (DataRoot) storageManager.root();
        List<Project> projectList = dataRoot.getProjectList();
        projectList.add(project);
        storageManager.storeAll(projectList);
        log.info("storageManager");
        return dataRoot.getProjectList();
    }

    public List<Project> getProjectList() {
        DataRoot dataRoot = (DataRoot) storageManager.root();
        log.info("storageManager: " + storageManager.toString());
        List<Project> projects = dataRoot.getProjectList();
        projects.forEach(System.out::println);
        return projects;
    }

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

    public String getContent() {
        DataRoot dataRoot = (DataRoot) storageManager.root();
        return dataRoot.getContent();
    }

    public void addContent(String content) {
        DataRoot dataRoot = (DataRoot) storageManager.root();
        log.info("repo location: " + dataRoot.getLocation());
        dataRoot.setContent(content);
        log.info("dataRoot content: " + dataRoot.getContent());
        storageManager.storeRoot();
    }

像这样的dataRoot

@Controller
@RequestMapping(path = "/projects")
public class ProjectResource {

    @Autowired
    private DataRepository repository;


    @GetMapping("/content/{content}")
    @ResponseBody
    public String setContent(@PathVariable String content) {
        repository.addContent(content);
       return repository.getContent();

    }

    @GetMapping("/content")
    @ResponseBody
    public String getContent() {
        return repository.getContent();

    }

    @GetMapping("/createSingle")
    @ResponseBody
    public List<Project> createSingleProject() {
        Project project = new Project("projectz","heimliches Projekt","2da3-adf2K-12KT",new User("René","Weishaupt"));
        repository.addProject(project);
        return repository.getProjectList();
    }



    @GetMapping("/all")
    @ResponseBody
    public List<Project> getAllProjects() {
        List<Project> projectList = repository.getProjectList();
        projectList.stream().forEach(p -> log.info(p.toString()));
        return projectList;
    }

现在重启不再抛出异常。

但是通过资源/存储库添加的所有项目都将无法重新启动。 但是,内容可以通过资源/存储库毫无问题地更改,并且在重新启动后仍然有效。

本文链接:https://www.f2er.com/299320.html

大家都在问