通过多线程上传多个文件时面对Nullpointer

时间:2019-06-26 07:55:07

标签: java spring multithreading autowired

我正在尝试使用多个线程将多个文件数据上传到数据库。

控制器层

System.out.println("saveStudent");
for (int i = 1; i < 10; i++)
{
    Thread t = new Thread(new FileHandlerClass("test" + i + ".csv"));
    t.start();
}

@Component
public class FileHandlerClass
    implements Runnable
{
    public FileHandlerClass()
    {
    }

    @Autowired
    private SpringbootService service;
    private String fileName;

    public FileHandlerClass(String fileName)
    {
        System.out.println(fileName);
        this.fileName = fileName;
    }

    @Override
    public void run()
    {
        this.service.saveStudent(this.fileName); // Facing nullpointer exception here
    }
}

但是我得到一个空指针异常 this.service.saveStudent(this.fileName);

Enter image description here

我该如何解决?

删除@Autowired是可行的,但是我不知道为什么在使用上面的代码时它没有初始化bean。

private SpringbootService service;
private String fileName;

public FileHandlerClass(String fileName, SpringbootService service)
{
    System.out.println(fileName);
    this.fileName = fileName;
    this.service = service;
}

@Override
public void run()
{
    service.saveStudent(this.fileName);
}

2 个答案:

答案 0 :(得分:0)

您没有初始化service,因此,当您致电this.service.saveStudent(this.fileName)时,您会得到NullPointerException。有关为什么@Autowired无法正常工作,请参见农民的回答。

另外,一般提示: 我将删除以下构造函数:

public FileHandlerClass()
{

}

这可能会导致fileName为空的情况,这也会导致NullPointerException

答案 1 :(得分:0)

您的服务未初始化,因为您使用FileHandlerClass创建了new。 您已将FileHandlerClass注释为@Component,并将服务字段注释为@Autowired。因此,如果您的SpringbootService也是一个组件(服务,存储库等),只需以“弹簧方式”实例化FileHandlerClass,例如,使用ApplicationContext,然后它将自动连接服务。

还有一件事。 Spring的@Component默认为单调。因此,如果要创建多个实例,则应指向@Scope,例如:

@Scope("prototype")

有关其工作原理的更多信息,请阅读 spring core documentation