Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpringBoot:如何访问java类@Autowired中的存储库不工作_Spring_Spring Boot_Spring Data Jpa - Fatal编程技术网

SpringBoot:如何访问java类@Autowired中的存储库不工作

SpringBoot:如何访问java类@Autowired中的存储库不工作,spring,spring-boot,spring-data-jpa,Spring,Spring Boot,Spring Data Jpa,Spring Boot:如何访问java class@Autowired不工作中的存储库 请用示例代码解释您的解决方案,因为我是Spring Boot新手 存储库 import java.util.List; import org.springframework.data.repository.CrudRepository; public interface StoreRepository extends CrudRepository<Store, Integer> {

Spring Boot:如何访问java class@Autowired不工作中的存储库

请用示例代码解释您的解决方案,因为我是Spring Boot新手

存储库

import java.util.List;
import org.springframework.data.repository.CrudRepository;

public interface StoreRepository extends CrudRepository<Store, Integer> {

    List<Store> findAll();
}
**商店服务**

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class StoreService {

    @Autowired
    private StoreRepository storeRepository;

    public StoreService() {

    }

    public List<Stores> getAllStores(){
        return (List<Stores>) storeRepository.findAll(); /* This works good. Through controller I can retrieve all data*/

    }

}
错误:

Exception in thread "StoreWorker : restartedMain" java.lang.reflect.InvocationTargetException
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [io.store.workers.StoreWorker]: Constructor threw exception; nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException

请用示例代码解释您的解决方案,因为我是Spring Boot新手。

您应该在构造函数级别使用@Autowire,以便在构造函数内部使用Autowire变量

@Component
public class StoreWorker {


@Autowired
public StoreWorker(StoreRepository storeRepository) {

    System.out.println(storeRepository.findAll()); 

}
(或)使用后期施工

在构造对象之后发生。因此,在构造函数完成之前不会设置它们


如果您需要运行一些初始化代码,您应该能够将构造函数中的代码拉入一个方法,并用@PostConstruct注释该方法。

您必须以以下方式更改代码:

如果您想在类的构造函数中使用自连线bean,请使用构造函数注入。这也是最推荐的注射方式

@Component
public class StoreWorker {

    private final StoreRepository storeRepository;

    public StoreWorker(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;
        System.out.println(storeRepository.findAll());
    }
}

因此,当
StoreWorker
被实例化时,自动连线bean
storeRepository
被注入。由于发生这种情况,您可以使用
storeRepository
bean。

您不应该在构造函数中放入任何逻辑。构造函数方法仅用于初始化实例。 使用单独的方法调用
storeRepository

@Component
public class StoreWorker {
    @Autowired
    private StoreRepository storeRepository;

    public void findAll() {
        System.out.println(storeRepository.findAll()); 
    }
}
Spring调用构造函数时,上下文未完全初始化,并且由于未使用构造函数注入,
storeRepository
尚未注入

构造函数注入是Spring团队推荐的注入方式。从Spring4.3开始,您甚至不需要在构造函数上添加
@Autowired
注释

@Component
public class StoreWorker {

    private StoreRepository storeRepository;

    //@Autowired not needed since v4.3
    public StoreWorker(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;
    }

    ...
}
如果您想依靠其他外部bean对bean进行进一步初始化,请使用带有
@PostConstruct
注释的单独方法进行初始化

@Component
public class StoreWorker {

    private StoreRepository storeRepository;
    private List<Store> stores;

    public StoreWorker(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;
    }

    @PostConstruct
    public void initializeMyBean() {
        stores = storeRepository.findAll(); 
    }
}
@组件
公营仓库工人{
私有存储库存储库;
私人名单商店;
公共存储工人(存储库存储库){
this.storeRepository=storeRepository;
}
@施工后
public void initializeMyBean(){
stores=storeRepository.findAll();
}
}

尝试使用存储库注释和组件still,我得到System.out.println(storeRepository);=各位,发表评论,然后对答案进行否决投票,这样,如果我的答案有任何缺陷,我就可以纠正它。简单地对答案投否决票会伤害其他人,它会停止回答stackover flow中的其他问题。
@Repository
扩展
org.springframework.data.Repository.Repository
interface@Matt谢谢你的评论。但提及存储库不会损害类,但也没关系。虽然我在回答的第二部分已经回答了这个问题。你可以编辑答案,而不是投反对票,对吗?这毁了我的周末,你凭什么认为我否决了你的答案?我只是在发表评论
@Component
public class StoreWorker {

    private StoreRepository storeRepository;

    //@Autowired not needed since v4.3
    public StoreWorker(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;
    }

    ...
}
@Component
public class StoreWorker {

    private StoreRepository storeRepository;
    private List<Store> stores;

    public StoreWorker(StoreRepository storeRepository) {
        this.storeRepository = storeRepository;
    }

    @PostConstruct
    public void initializeMyBean() {
        stores = storeRepository.findAll(); 
    }
}