Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@Async:NullPointerException的Weblogic部署中的Spring自动连线和bean范围_Java_Spring_Weblogic - Fatal编程技术网

Java 使用@Async:NullPointerException的Weblogic部署中的Spring自动连线和bean范围

Java 使用@Async:NullPointerException的Weblogic部署中的Spring自动连线和bean范围,java,spring,weblogic,Java,Spring,Weblogic,考虑采用以下(简化)架构的Spring webapp: 具有注释为@Async的方法的服务: @服务 公共类MatriceAsyncFacade实现了IMatriceAsyncFacade{ @资源 私有矩阵服务myService; @凌驾 @异步(MatriceFacadeAsyncConfig.MATRICE\u执行者\u名称) 公共未来getMatriceFuture(Matrice Matrice)抛出TaskRejectedException{ 返回新的AsyncResult(this

考虑采用以下(简化)架构的Spring webapp:

  • 具有注释为@Async的方法的服务:
  • @服务
    公共类MatriceAsyncFacade实现了IMatriceAsyncFacade{
    @资源
    私有矩阵服务myService;
    @凌驾
    @异步(MatriceFacadeAsyncConfig.MATRICE\u执行者\u名称)
    公共未来getMatriceFuture(Matrice Matrice)抛出TaskRejectedException{
    返回新的AsyncResult(this.myService.build(matrice));
    }
    }
    
  • 配置类:
  • @配置
    @使能同步
    公共类MatriceFacadeAsyncConfig{
    公共静态最终字符串矩阵\u执行器\u NAME=“builderMatriceExecutor”;
    @资源
    private InitialisationDto InitialisationDto;
    @Bean(名称=矩阵执行器名称)
    //@Scope(WebApplicationContext.Scope\u APPLICATION)//重要\u行\u 1
    公共执行器线程池任务执行器(){
    final ThreadPoolTaskExecutor tpte=新的ThreadPoolTaskExecutor();
    info(“threadPoolTaskExecutor()corePoolSize={}”,
    this.initialisationDto.getMatriceCExecutorCorePoolSize());
    setCorePoolSize(this.initialisationDto.getMatriceCExecutorCorepoolSize());
    返回tpte;
    }
    }
    
  • 一个配置bean(InitialisationDto),在application-context.xml中声明,首先由Spring实例化
  • 
    
    问题是:

    • 在(本地)Tomcat中部署webapp,效果很好(注意注释的@Scope()

    • 在我们的集成Weblogic服务器中部署webapp时,我必须添加@Scope行,否则部署时会出现NullPointerException

    原因:java.lang.NullPointerException
    在com.my.pacakge.config.matricefacadesyncconfig.threadPoolTaskExecutor上(matricefacadesyncconfig.java:48)
    在com.my.pacakge.config.matricefacadesyncconfig$$EnhancerBySpringCGLIB$$615d2556.CGLIB$threadPoolTaskExecutor$0()上
    
    NPE从该行提升:

    tpte.setCorePoolSize(this.initialisationDto.getMatriceCExecutorCorepoolSize());
    
    在日志中,我首先可以看到webapp正在初始化,InitialisationDto正在实例化和填充。紧接着,ConfigurationClass中的bean被创建并显示日志“corePoolSize=…”在那之后,我有了NPE,就好像Weblogic试图再次实例化这个bean,但是没有初始化数据可用一样

    默认情况下,bean是单例的,那么为什么在executorbean上添加@Scope(WebApplicationContext.Scope\u APPLICATION)似乎可以解决这个问题呢

    注意:在添加范围注释时,Executor似乎是延迟实例化的,而不是在应用程序部署时

    版本:

    • 爪哇8
    • 弹簧4.3.9.1释放
    • Weblogic 12.2
    • 雄猫9

    TLDR:在Weblogic部署中,@Async[singleton vs APPLICATION\u SCOPE]bean之间的实际差异?

    确保在Weblogic上您不会意外地将附带的Spring与Weblogic一起使用(是的,Weblogic附带了它自己的(旧)版本的Spring!)。这会导致行为上的差异。此外,问题更多的是单例配置bean与应用程序范围的配置bean(因为错误发生在配置上,而不是异步调用的方法)。在单例和应用程序范围上有一点不同。单例是每个应用程序上下文的(因此,如果您有一个servlet和侦听器,那么您就有两个上下文!)。