Spring 引导 :如何在 java 类中访问存储库@Autowired不起作用



Spring Boot:如何在java类中访问存储库@Autowired

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

存储 库

import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface StoreRepository extends CrudRepository<Store, Integer> {
List<Store> findAll();
}

实体商店

import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Store {
@Id
private Integer sid;
private String sname;

public Store() {
}
public Store(Integer sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
}
///GETTER and Setters   here...
}

**商店服务 **

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*/
}
}

简单的 Java 类

@Component
public class StoreWorker {
@Autowired
private StoreRepository storeRepository;
public StoreWorker() {
System.out.println(storeRepository.findAll()); /* Error */
}

错误:

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 的新手。

你必须以这种方式更改你的代码:

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

@Component
public class StoreWorker {
private final StoreRepository storeRepository;
public StoreWorker(StoreRepository storeRepository) {
this.storeRepository = storeRepository;
System.out.println(storeRepository.findAll());
}
}

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

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

@Component
public class StoreWorker {
@Autowired
private StoreRepository storeRepository;
public void findAll() {
System.out.println(storeRepository.findAll()); 
}
}

当 Spring 调用你的构造函数时,上下文没有完全初始化,并且由于你不使用构造函数注入,所以还没有注入storeRepository

构造函数注入是 Spring 团队推荐的注入方式。从 Spring 4.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(); 
}
}

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

@Component
public class StoreWorker {

@Autowired
public StoreWorker(StoreRepository storeRepository) {
System.out.println(storeRepository.findAll()); 
}

(或(使用PostConstruct。

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

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

最新更新