问题说明 :
今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。

原因分析 :

web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的)

解决方案 :

线程中获取bean

import org.springframework.context.ApplicationContext;

public class ServiceFactory {

    public static  ApplicationContext context=null;

    public static Object getInstance(String serviceName){

        if (null==context) {
            context=ApplicationContextLoaderListener.getApplicationContext();
        }

        return  context.getBean(serviceName);
    }
}
  @Override
  public void run() {

    // 记录推荐记录
    GfRegistrationService gfRegistrationService =
        (GfRegistrationService) ServiceFactory.getInstance("gfRegistrationService");
    List<GfRegistration> insertRegistrationlist = this.getGfRegistrationlist();
    if (insertRegistrationlist.size() > 0) {
      int[] resultArry = gfRegistrationService.batchInsert(insertRegistrationlist);
      if (resultArry.length > 0) {
        logger.info("信息批量记录", "批量记录信息,length= " + resultArry.length);
      } else {

        logger.info("信息批量记录", "推荐商户信息为空");
      }
    }
  }
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐