1

JPAを利用してデータベースにアクセスする忍者フレームワークを使用しています。

接続をセットアップして、サンプルコントローラークラスで実行することができました。

初期化時に、現在のすべてのユーザーをデータベースからJavaマップにロードする「userManager」をモデル化したいと思います。

そうすると、entitiyManagerProvider が null に設定されているため、entitiyManagerProvider.get() を呼び出すと java.lang.NullPointerException が発生します。

「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.");
    }

}
4

1 に答える 1

3

new問題は、キーワードを使用して直接作成されたオブジェクトに対してインジェクションが機能しないことです。そして、これがgetInstance()メソッドで行っていることです。また、オブジェクトが作成された後にのみ注入されるため、コンストラクターで注入された値に依存しないでください。

インジェクションをオンにするにはUserManager、フレームワークによって のインスタンスを作成する必要があります。コントローラーはフレームワークによって自動的に作成されるため、そこでインジェクションが機能します。

コードを修正するには、からサービスを作成し、UserManagerコンストラクターから reloadUsersFromDb への呼び出しを削除し、このメソッドを起動時に実行するようにマークし@Startます

于 2015-08-23T20:52:44.870 に答える