Spring Boot JPA无法正常工作

问题描述 投票:0回答:3

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

}

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

java jpa spring-boot
3个回答
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
投票

您使Autowired字段成为静态,并且当类加载器加载静态值时,Spring上下文尚未加载且您的对象未正确初始化;删除static关键字:

@Autowired
private TagRepository tagRepository;

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

}

但最初......你不应该自动修改静态变量。

© www.soinside.com 2019 - 2024. All rights reserved.