我正在尝试使用多个线程将多个文件数据上传到数据库。
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)
;
我该如何解决?
删除@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);
}
答案 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