【问题标题】:Changing class loader for flow assembly更改流组装的类加载器
【发布时间】:2019-03-12 22:39:18
【问题描述】:

我正在使用 Spring Web flow 2.4.8.RELEASE 和 Spring 版本 4.3.11。流文件中使用了某些不属于标准类加载器的类。它们是使用特定于应用程序的类加载器加载的。

如何更改 FlowModelFlowBuilder 使用的类加载器?

java.lang.IllegalArgumentException: Unable to load class '<CLASS TO LOAD USING DIFFERENT CLASS LOADER>'
at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.toClass(FlowModelFlowBuilder.java:977)
at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.parseFlowVariable(FlowModelFlowBuilder.java:402)
at org.springframework.webflow.engine.builder.model.FlowModelFlowBuilder.buildVariables(FlowModelFlowBuilder.java:181)
at org.springframework.webflow.engine.builder.FlowAssembler.directAssembly(FlowAssembler.java:103)
at org.springframework.webflow.engine.builder.FlowAssembler.assembleFlow(FlowAssembler.java:91)
at org.springframework.webflow.engine.builder.DefaultFlowHolder.assembleFlow(DefaultFlowHolder.java:109)
at org.springframework.webflow.engine.builder.DefaultFlowHolder.getFlowDefinition(DefaultFlowHolder.java:84)
at org.springframework.webflow.definition.registry.FlowDefinitionRegistryImpl.getFlowDefinition(FlowDefinitionRegistryImpl.java:60)
at org.springframework.webflow.executor.FlowExecutorImpl.launchExecution(FlowExecutorImpl.java:138)
at org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:263)
at org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:57)

FlowModelFlowBuilder 调用 getLocalContext().getApplicationContext().getClassLoader() 来获取类加载器。它返回 ParallelWebappClassLoader 的实例。

我正在寻找一种让 FlowModelFlowBuilder 指定自定义类加载器的方法。是否可以自定义 FlowModelFlowBuilder?

【问题讨论】:

    标签: spring-webflow-2


    【解决方案1】:

    找到另一种方式。与其尝试寻找自定义 Flow 细节的方法,不如使用 ContextRefreshedEvent 侦听器并更改类加载器。由于在上下文刷新后加载了 bean,因此以下方法有效

    public class WebflowApplicationContextListener implements ApplicationListener<ContextRefreshedEvent> {
    
        @Override
        public void onApplicationEvent( final ContextRefreshedEvent p_event ) {
            ApplicationContext l_appContext = p_event.getApplicationContext();
            if ( l_appContext instanceof GenericWebApplicationContext ) {
                ( (GenericWebApplicationContext) l_appContext ).setClassLoader( getSpecificContextClassLoader() );
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多