通过@EJB注入dao



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

@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");

但是@EJB在LoginService中注入的UserBean UserBean是空的。

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

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

如果你通过new创建你的服务,这个实例不被认为是容器管理的实例,所以它的任何功能(比如注入)都是不可用的。当您注入它或通过JNDI查找它的引用时,您将获得完全托管的实例,所有注入都为您完成。

不知道你在哪个Java EE堆栈上(5或6),但请记住,你不能简单地通过@EJB注入到手工创建的类中。

最新更新