Spring Boot JPA无效

时间:2017-12-26 03:41:23

标签: java jpa spring-boot

我有一个控制器类,如下所示。我有一个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);
    }

}

有人可以告诉我这是什么问题吗?

3 个答案:

答案 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;
    }

}

但最初......你不应该自动转向静态变量。