2016-08-12 17 views
0

JavaEEで基本的なWebアプリケーションを操作する。私はJavaBean、Bean Interface、Servlet、Entity、JSPページを作成しました。私は、サーブレットのURLをリクエストすると、それはError instantiating servlet class and the root cause is:@EJBでプログラムがクラッシュする

javax.naming.NameNotFoundException: Name [com.packageName.UserServlet/userDao] is not bound in this Context. Unable to find [com.packageName.UserServlet]. 

エラーメッセージが表示されます奇妙なこと(私の意見では)私はUserServletクラスの@EJB注釈を削除すると、それが動作することです。私は理由を理解できません。

@EJBを削除すると、@ EJBを削除したので、userDao.addUser(user)(NullPointerException)を実行すると問題がありますか?

私はJavaEEの初心者ですので、用語が間違っているかもしれませんが、私の問題を理解していただければ幸いです。

クラス:UserServlet

@WebServlet(name = "UserServlet", urlPatterns = {"/UserServlet"}) 
public class UserServlet extends HttpServlet { 

@EJB("UserDaoBean") <---- This annotation makes it crash 
private UserDaoLocal userDao; 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    int userId = 2; 
    User user = new User(userId, "userName", "password"); 
    userDao.addUser(user); 
    request.getRequestDispatcher("userinfo.jsp").forward(request, response); 
} 

クラス:ユーザー

@Entity 
@Table 
@NamedQueries(@NamedQuery(name = "User.getAll", query = "select e from User e")) 
public class User implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column 
private int userid; 
@Column 
private String name; 
@Column 
private String password; 

public User() { 
} 

public User(int userid, String name, String password) { 
    this.userid = userid; 
    this.name = name; 
    this.password = password; 
} 

public int getUserid() { 
    return userid; 
} 

public void setUserid(int userid) { 
    this.userid = userid; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getPassword() { 
    return password; 
} 

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

クラス:UserDaoLocal

public interface UserDaoLocal { 

void addUser(User user); 

} 

クラス:UserDaoBean

@Local 
@Stateless(name = "UserDaoBean") 
public class UserDaoBean implements UserDaoLocal { 

@PersistenceContext 
private EntityManager entityManager; 

public UserDaoBean() { 
} 

@Override 
public void addUser(User user) { 
    entityManager.persist(user); 
} 
} 
+0

どのアプリケーションサーバーを使用していますか?スタンドアロンのTomcatは、これをコンパイルするためのjarファイルでも、動作しません。 GlassfishやWildflyを例に使っていますか? – stdunbar

+0

私はTomCat 7.0.70を使用するIDEとしてIntelliJを使用しています。データベースとして私はPostgreSQLを使用します。私は外部ライブラリに "postgresql jdbc driver"を追加しました。また、jsp-apiとservlet-apiをTomcatフォルダに追加しました。 – Tobias

答えて

0

@WebServletはEJB注入ではあまり自然に動作しないようです。 例外として、コンテナが奇妙なJNDI名を使用してEJBインスタンスを検索したことがわかります。com.packageName.UserServlet/userDao

ボイラープレートコードであっても、この問題を回避するために過去のようにすることができます。など、あなたのweb.xmlで、あなたのEJB:no- interface viewがある場合

<ejb-local-ref> 
    <ejb-ref-name>UserDaoBean</ejb-ref-name> 
    <ejb-ref-type>Session</ejb-ref-type> 
    <local>yourPackage.UserDaoBean</local> 
    </ejb-local-ref> 
1

すでにinterface viewを持っている場合、なぜあなたはUserDaoBean@localbeanと注釈の注釈付けされているが、@localbeanを使用する必要があります。 Beanのローカルビューを表すので、インタフェースに@local注釈を付ける必要があります。そしてあなたがデフォルトのクラス名はあなただけ@EJB(beanName="UserDaoBean") private UserDaoLocal userDao;

でBean名を指定 @EJBを使用するか、またはちょうどにname属性を削除カントがオーバーライドしているので、あなたは豆

@Stateless(name = "UserDaoBean") 
public class UserDaoBean implements UserDaoLocal {} 

に名前を与えているようですstateless annotation

@Stateless 
public class UserDaoBean implements UserDaoLocal {} 

そしてこの

などのEJB呼び出しを行います
@EJB 
    UserDaoLocal userbean 

実行する前に、必ずきれいにしてからビルドしてください。

+0

あなたの提案に従ってクラスを更新しました。これで、@EJB( "UserDaoBean")で構文エラーが発生しました。私はあなたの提案をいつまでも理解できなかったでしょうか? – Tobias

+0

私は自分の答えを編集します – Priyamal

+0

'@EJB(name =" UserDaoBean ")'を使ってください。 '@EJB(" UserDaoBean ")の代わりに。 – Priyamal

関連する問題