Java EntityManagerProvider被注入为null

Java EntityManagerProvider被注入为null,java,hibernate,jpa,nullpointerexception,ninjaframework,Java,Hibernate,Jpa,Nullpointerexception,Ninjaframework,我使用的是忍者框架,它 我成功地建立了一个连接,并在一个示例控制器类中运行它 我想建模一个userManager,它在初始化时将数据库中的所有当前用户加载到java映射中 这样做时,调用EntityManagerProvider.get时会遇到java.lang.NullPointerException,因为EntityManagerProvider设置为null 我不确定是什么导致了这个问题以及如何解决它,因为UserManager与我的无问题测试控制器具有相同的注释。由于我没有任何忍者或JP

我使用的是忍者框架,它

我成功地建立了一个连接,并在一个示例控制器类中运行它

我想建模一个userManager,它在初始化时将数据库中的所有当前用户加载到java映射中

这样做时,调用EntityManagerProvider.get时会遇到java.lang.NullPointerException,因为EntityManagerProvider设置为null

我不确定是什么导致了这个问题以及如何解决它,因为UserManager与我的无问题测试控制器具有相同的注释。由于我没有任何忍者或JPA的经验,这可能是一个非常简单的修复,我只是忽略了,我会感谢任何帮助

这是UserManager.java的代码:

package model;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.google.inject.Inject;
import com.google.inject.Provider;
import dto.UserDTO;
import ninja.jpa.UnitOfWork;

public class UserManager {
    @Inject
    Provider<EntityManager> entitiyManagerProvider;

    private static UserManager instance;

    private Map<Integer, UserDTO> users = new HashMap<Integer, UserDTO>();

    //UserManager is a Singleton
    public static synchronized UserManager getInstance(){
        if (UserManager.instance == null){
            UserManager.instance = new UserManager();
        }
        return UserManager.instance;
    }

    private UserManager() {
        // load all existing users to map
        reloadUsersFromDb();

    }

    public int getAmountUsers(){
        return users.values().size();
    }


    /**
     * reloads ALL users in the map from the db
     */
    @UnitOfWork
    private void reloadUsersFromDb() {
        if (entitiyManagerProvider == null) {
            System.out.println("provider is null"); //this is printed
        } else {
            System.out.println("provider is NOT null"); //not printed
        }
        EntityManager entityManager = entitiyManagerProvider.get();
        //^-- causes null Pointer exception
        Query q = entityManager.createQuery("SELECT users FROM users");
        List<UserDTO> dbUsers = q.getResultList();

        int loadedUsers = 0;
        users.clear();
        for (UserDTO dbUser : dbUsers) {
            users.put(dbUser.getId(), dbUser);
            loadedUsers++;
        }

        System.out.println("loaded " + loadedUsers + "users from db to applicaton.");
    }

}

问题是,注入永远不会处理直接使用new关键字创建的对象。这就是您在getInstance方法中所做的。此外,您不应该依赖于构造函数中的注入值,因为它们仅在创建对象后注入

要启用注入,框架必须创建UserManager的实例。控制器由框架自动创建,因此注入在那里工作


要修复代码,可以使用UserManager创建服务,从构造函数中删除对reloadUsersFromDb的调用,并将此方法标记为在启动时使用@Start运行,如

中所述。似乎我无法启动任何注释为@UnitOfWork的服务方法-您知道为什么会这样/如何解决它吗?您会遇到什么类型的异常?对于需要在事务中运行的写操作,除了@UnitOfWork之外,还可以使用注释@Transactional来完成。或者,如果它与控制器一起工作,只需将控制器注入到服务中并从服务调用其方法即可。所有细节都在忍者文档页面上:很抱歉回复太晚。该函数在服务启动时被调用,但在具有@Transactional注释时未被调用。不确定到底是什么修复了它,但我重新编写了整个类,现在它可以工作了。