2013-03-10 126 views
0

我刚开始使用EJB。我想用JTA从数据库中接收一些数据。 我的实体:@EJB注入dao

@Entity 
@Table(name = "User") 
@NamedQuery(name = "User.findByAddressName", 
      query = "select u from User u where u.userAddress.addressName = :addressName") 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long userID; 

    @Column(name = "userFirstName", length = 45) 
    private String userFirstName; 

    @Column(name = "userLastName", length = 45) 
    private String userLastName; 

    @Column(name = "userBirthDate") 
    private Date userBirthDate; 

    @Column(name = "userPhone") 
    private String userPhone; 

    @Column(name = "userPassword") 
    private String userPassword; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "addressUser") 
    private Email userAddress; 

    public User() { 
    } 

    public User(String userFirstName, String userLastName, Date userBirthDate, String userPhone, String userPassword) { 
     this.userFirstName = userFirstName; 
     this.userLastName = userLastName; 
     this.userBirthDate = userBirthDate; 
     this.userPhone = userPhone; 
     this.userPassword = userPassword; 
    } 
} 

吾道:

@Stateless 
public class UserBean { 

    @PersistenceContext(unitName = "server") 
    private EntityManager em; 

    public User getUserByEmail(String email) { 
     TypedQuery<User> queryUser = em.createNamedQuery("User.findByAddressName", 
       User.class); 
     queryUser.setParameter("addressName", email); 
     return queryUser.getSingleResult(); 
    } 

} 

我的服务:

@Stateless 
public class LoginService { 
    @EJB 
    UserBean userBean; 

    public boolean loginUser(String userEmail, String userPass) { 
     User user = userBean.getUserByEmail(userEmail); 

     if (userPass.equals(user.getUserPassword())) { 
      return true; 
     } else return false; 
    } 
} 

我尝试收到数据:

boolean b = new LoginService().loginUser("user", "user1"); 

不过的UserBean的UserBean,通过注入LoginE中的@EJB rvice为null。

有很多关于如何做这些事情的简单例子,我都完全一样,但它仍然抛出NullPointerException,我不知道为什么。

回答

1

受益于Java EE环境中的注入,您无法通过new实例化您的服务。您需要通过@EJB注入它或使用JNDI查找它。

如果您通过new创建服务,则此实例不被视为容器管理的实例,因此它的任何功能(如注入)都不可用。当你注入它或通过JNDI查找它的引用时,你会为你完成所有注入的完全托管实例。

不知道您在哪个Java EE堆栈上(5或6),但请记住,您不能简单地通过@EJB将事物注入到手工创建的类中。它们也需要由容器创建以利用注入。