我有一个控制器类,如下所示。我有一个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);
}
}
有人可以告诉我这是什么问题吗?
答案 0 :(得分:2)
我认为您使用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);
答案 1 :(得分:1)
您使 Autowired 字段 static ,当类加载器加载静态值时,Spring上下文尚未加载且您的对象未正确初始化;删除静态关键字:
@Autowired
private TagRepository tagRepository;
答案 2 :(得分:1)
你无法直接自动装配静态变量
那么,你有一些选择。 首先,自动装配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;
}
}
但最初......你不应该自动转向静态变量。