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