【发布时间】:2014-06-29 21:12:47
【问题描述】:
在我在这一行中得到 NullPointerException 之前
EntityManager manager = emf.createEntityManager();
但我通过在上面添加一行来修复它
emf = Persistence.createEntityManagerFactory("main");
现在我在这一行得到 NullPointerException
transaction.begin();
我不明白为什么。我试图从 try catch 块中取出它,但得到了相同的结果。同样在最后我尝试添加 emf.close();但错误没有得到修复。另外,我包含 @Named 注释是因为有人建议我这样做。
import java.io.Serializable;
import javax.inject.Named;
import javax.inject.Inject;
import java.sql.*;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceUnit;
import javax.persistence.TypedQuery ;
import javax.transaction.UserTransaction;
import javax.transaction.RollbackException;
import javax.persistence.criteria.*;
import java.util.List;
import java.util.*;
@Named
public class UserManager implements Serializable{
@PersistenceUnit(unitName="main")
private EntityManagerFactory emf;
@Resource
private UserTransaction transaction;
public UserManager() {}
public UserTransaction getTransaction() { return transaction; }
public void setTransaction(UserTransaction transaction) { this.transaction = transaction; }
public void addUser(User v) throws Exception {
emf = Persistence.createEntityManagerFactory("main");
EntityManager manager = emf.createEntityManager();
boolean commit;
try {
transaction.begin();
manager.joinTransaction();
commit = false;
try {
manager.persist(v);
transaction.commit();
commit = true;
}finally {
if(commit==false){
transaction.rollback();
}
}
}finally {
manager.close();
//emf.close();
}
}
@Named("subBean")
@RequestScoped
public class UserBean implements Serializable{
private List<User> users;
private UserManager vm;
private User v;
private int total;
public UserBean() {
this.total= 0;
users = new ArrayList<User>();
vm = new UserManager();
v = new User();
}
public String addUserAction() throws Exception {
vm.addUser(v);
users = getUsers();
return "submit1";
}
//getters and setters
}
【问题讨论】:
-
您声明了事务,但它没有被初始化。你是在调用 addUser() 之前调用 setTransaction() 吗?
-
@shaunc 它应该由 CDI 注入。
-
看起来您正在手动初始化
UserManager类,因此 CDI 无法注入相应的变量。如果您是手动完成工作,那么您不应该使用 CDI,或者应该检查您是否遵循正确的设计。 -
我从另一个是 CDI bean 的类中调用 addUser(),并且在 RequestScoped 处命名,并且在该类中,我有一个 AddUserAction 方法,该方法在 UserManager 类中调用 addUser。我确实在 addUser 方法之上有 get 和 setTransaction 方法,但我没有在任何地方调用它们。他们在那里,因为我使用 @Resource 私有 UserTransaction 事务;
-
@user1282256 提供必要的代码,看看你是如何做到这一点的。
标签: java jpa nullpointerexception cdi named-entity-recognition