2012-10-20 50 views
4

我是Java EE的新手,並且一直試圖解決這個問題近一個星期。 這是我的會話bean中的代碼,在這裏我得到一個NullPointerException。發現實體管理器沒有被注入。EJB沒有被注入導致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"; 
     } 
    } 
} 
+0

什麼是您的persistence.xml樣子?另外,什麼容器和版本? –

+0

對不起,j2ee是新手,但我怎麼知道容器和版本? – Newbieee

+0

你在哪個服務器上運行? –

回答

2

調用new UserFacade()只會做什麼總是這樣在Java中:調用UserFacade類的無參數構造函數。

要獲得對EJB的引用,您需要將它注入到託管bean中,或者使用JNDI檢索對EJB的引用。

+0

@JBNizet:如果構造函數被調用,不是一個對象班級創建?在構造函數被調用後,不應該在他的代碼中將userFacade引用指向一個Object,即Bean? – arjacsoh

+0

@arjacsoh:對EJB的引用不是對bean類實例的直接引用,而是對包裝此實例的代理的引用。代理是什麼使其成爲一個EJB:它處理事務,安全性,異常等。 –

1

使用DI注入在managedBean到EJB,不以MB爲單位的構造函數創建實例:

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

你做到了這一點,它的工作。非常感謝你。我在想這個錯誤是在會話bean中,所以從來沒有正確地檢查過我的託管bean。 – Newbieee