我有一个控制器类,如下所示。我有一个TagRepository
接口,它扩展了我用来将TagReader
实例保存到我的数据库的JPA存储库,当我在我的控制器类中使用它时它工作正常。但是,当我尝试在另一个类中使用tagRepository
并尝试从那里保存我的TagReader
对象时,它会抛出一个空指针异常。
以下逻辑工作正常。
@RestController
public class Controller {
@Autowired
TagRepository tagRepository;
@Autowired
Rfid6204Connection rfid6204Connection;
@RequestMapping(value = "/test")
public void testRepoController(){
String tagid = "0x3504ACE6E0040E5147D516A6";
String serial ="00333478";
String departure ="2017-12-22T12:16:58.857";
String type = "ISOC";
TagReader tagReader = new TagReader(tagid,serial,departure,type,"5");
tagRepository.save(tagReader);
}
}
以下逻辑抛出空指针异常。
@component
public class Rfid6204Connection{
@Autowired
static TagRepository tagRepository;
public static void test(TagReader tag){
tagRepository.save(tag);
}
}
有人可以告诉我这是什么问题吗?
我认为你使用Rfid6204Connection.test
作为静态方法。 Spring不适用于Static方法。它适用于Spring容器实例化的对象。所以改变你的Rfid6204Connection
如下;
@Component
public class Rfid6204Connection{
@Autowired
private TagRepository tagRepository;
public void test(TagReader tag){
tagRepository.save(tag);
}
}
并在任何地方使用它,如下所示;
@Autowired
Rfid6204Connection rfid6204Connection;
// Within a method or constructor
rfid6204Connection.test(tag);
您使Autowired字段成为静态,并且当类加载器加载静态值时,Spring上下文尚未加载且您的对象未正确初始化;删除static关键字:
@Autowired
private TagRepository tagRepository;
你不能直接自动装配静态变量
那么,你有一些选择。首先,自动装配TagRepository实例,并在依赖注入之后将实例设置为静态变量
@Component
public class Rfid6204Connection {
private static TagRepository sTagRepository;
@Autowired
private TagRepository tagRepository;
@PostConstruct
public void init() {
Rfid6204Connection.sTagRepository = tagRepository;
}
}
第二个准备TagRepository的setter方法并放置一个autowired
public class Rfid6204Connection {
private static TagRepository tagRepository;
@Autowired
public void setTagRepository(TagRepository tagRepository) {
Rfid6204Connection.tagRepository = tagRepository;
}
}
但最初......你不应该自动修改静态变量。