EJB未被注入导致NullPointerException。

4

我是Java EE的新手,已经试图解决这个问题将近一周时间了。以下是我的会话Bean代码,在其中我遇到了一个NullPointerException。发现实体管理器没有被注入。

会话Bean的代码:

package session;

import entity.User;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class UserFacade extends AbstractFacade<User> {
    @PersistenceContext (unitName = "EXAMPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
    return em;
    }

    public UserFacade() {
    super(User.class);
    }

    public String validateUser(String username, String password) {
    System.out.println("in facade");    
    boolean pwdMatch = false;

    System.out.println("in UserInfoFacade validate " + em);
    try {
        System.out.println("username " + username);
        System.out.println("password " + password);

        if(em == null) {
        System.out.println("em is null");
        }
        else {
        System.out.println("em is not null");
        }

        List results = em.createNamedQuery("User.findByUserName").setParameter("userName", username).getResultList();

        if(results == null) {
        System.out.println("results is null");
        }
        else {
        System.out.println("results is not null");
        }
        System.out.println("Entity manger is open " + em.isOpen());

        if (!results.isEmpty())
        {

            Iterator userList = results.iterator();
            while (userList.hasNext())
            {
            User user = (User) userList.next();
            if (user != null)
            {
                if (user.getPassword().equals(password))
                {
                pwdMatch = true;
                }
                else {
                pwdMatch = false;
                }
            }
            else {
                return "NULL";
            }
            }
            if (pwdMatch) {
            return "MATCH";
            }
            else {
            return "NO_MATCH";
            }
        }
        else {
        return "NOT_FOUND";
        }
    } catch (Exception ex) {
        //ex.printStackTrace();
        System.out.println("Caught exception in UserFacade " + ex.toString());
    }
    return "NULL";
    }


}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="EXAMPU" transaction-type="JTA">
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
      <jta-data-source>EXAM</jta-data-source>

    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties/>
  </persistence-unit>
</persistence>

托管Bean的代码: userBean

package managed;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import session.UserFacade;
import javax.ejb.EJB;

@ManagedBean
@SessionScoped
public class userBean {

    private String username, password;
    private String response="" ;
    private UserFacade userFacade;

    public userBean() {
        this.userFacade = new UserFacade();
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getResponse() {
        return response;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setResponse(String response) {
        this.response = response;
    }

    public String validate() {
        System.out.println("in validate going to user facade" + username + password);
        response = userFacade.validateUser(username,password);
        System.out.println("validUser value  " + response);
        if (response.equals("MATCH")){           
            return "welcome.xhtml";
         }
        else
            return "index.xhtml";
        }
     }
}

你的 persistence.xml 文件长什么样?另外,你使用的是哪个容器和版本? - Kaleb Brasee
抱歉,我是J2EE的新手,但我该如何知道使用哪个容器和版本? - Newbieee
你在运行哪个服务器? - Kaleb Brasee
GlassFish 3.x 和 IDE 是 NetBeans 7.2。 - Newbieee
其他 SLSB 的注入是否有效? - Aksel Willgert
显示剩余3条评论
2个回答

2

使用依赖注入将ejb注入到managedBean中,不要在mb的构造函数中创建实例:

@ManagedBean @SessionScoped 
public class userBean {
    @EJB
    UserFacade  userFacade;
}

你做到了并且它起作用了。非常感谢大家。我一直认为错误在会话Bean中,所以没有仔细检查我的托管Bean。 - Newbieee

2

调用new UserFacade()只会像Java中一样执行它总是执行的操作: 调用UserFacade类的无参数构造函数。

要获取对EJB的引用,您需要将其注入到托管bean中,或使用JNDI检索对EJB的引用。


@JBNizet:如果调用构造函数,不是创建该类的对象吗?在他的代码中,构造函数被调用后,userFacade引用难道不应该指向一个对象,即Bean吗? - arjacsoh
@arjacsoh:对 EJB 的引用并不是对 bean 类实例的直接引用,而是对包装该实例的代理的引用。代理是使其成为 EJB 的原因:它处理事务、安全性、异常等。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接