存储库自动连线返回null

时间:2019-07-10 17:02:49

标签: spring-data-jpa repository autowired

我要创建一个在后端使用Spring Boot,在前端使用Swing的应用程序。我需要在服务类上使用自动装配的存储库,当我需要实例化服务类时如何建立存储库?

我已经尝试将存储库更改为BeanFactory,试图更改文件的位置,但我无法逃脱!我需要实例化Service类,而autowired对此不起作用。

我有一个名为Permission的模型。 存储库(PermissionRepository.java):

@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long>{
    Optional<Permission> findByDescription(String description);    
}

服务(PermissionService.java):

@Autowired
BeanFactory beanFactory;

public List<Permission> loadAll() {
 return this.beanFactory.getBean(PermissionRepository.class).findAll();
}

使用(BasicOperations.java):

public static void initialPermission() {
 try {
    if (new PermissionService().loadAll().isEmpty()) {
    //logics
    }
  } catch(Exception e) {
    ...
  }
}  

我希望有一个列表java.util.List,但是错误是我的自动装配库上的nullPointer 堆栈:

  

线程“ AWT-EventQueue-0”中的异常java.lang.NullPointerException       在com.riTrap.service.PermissionService.loadAll(PermissionService.java:20)

1 个答案:

答案 0 :(得分:0)

您应该使用自动装配而不是新的PermissionService。您使用loadAll检查数据库是否包含元素。如果数据库很大,此方法可能会损坏您的应用程序。建议:改为使用计数

@Service
public class PermissionService {

    @Autowired
    PermissionRepository permissionRepository;

    public List<Permission> loadAll() {
        return permissionRepository.findAll();
    }

    public boolean isEmpty() {
        return permissionRepository.count() == 0L;
    }
}

如果需要在使用前初始化bean,可以使用构造函数:

@Service
public class BasicOperations {

    @Autowired
    public BasicOperations(PermissionService permissionService){
        if(permissionService.isEmpty()){
            //DO STUFF
        }
    }
}