0

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;
    }
}

私のDAO:

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

しかし、LoginService で @EJB によって注入された UserBean userBean は null です。

そのようなことを行う方法の簡単な例がたくさんあります。私はすべてまったく同じことをしていますが、それでも NullPointerException をスローしています。理由はわかりません。

4

1 に答える 1

1

Java EE 環境内でインジェクションを利用するために、 を介してサービスをインスタンス化することはできませんnew@EJB経由で注入するか、JNDI を使用してルックアップする必要があります。

このインスタンスを介してサービスを作成するnewと、コンテナー管理のインスタンスとは見なされないため、その機能 (インジェクションなど) は使用できません。それを注入するか、JNDI を介してその参照をルックアップすると、すべての注入が行われた完全に管理されたインスタンスが得られます。

@EJBどの Java EE スタック (5 または 6) を使用しているかはわかりませんが、手作業で作成されたクラスに単純に注入することはできないことに注意してください。インジェクションを利用するには、コンテナーによっても作成する必要があります。

于 2013-03-10T17:41:32.470 に答える