1

私のプロジェクトは Glassfish 3.0.1 で実行されています @PersistenceContext アノテーションを使用して EntityManager を注入しようとしています。これが私のコードです:

@Stateless
public class UserBean implements UserBeanRemote {

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

    public UserBean() {
        if (this.em == null) {
            System.err.println("NULL");
        }
    }
    ...
}

コンソールに「NULL」というエラー メッセージが表示されます。私はすでに私のものに似たトピックを 5 ~ 6 見ました。しかし、私が理解した唯一のことは、おそらく私のpersistence.xmlに問題があるということです。はい、これ:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">

    <persistence-unit name="RHDManagementPlatformPU" transaction-type="JTA">
        <provider>oracle.toplink.essentials.PersistenceProvider</provider>
        <jta-data-source>dev_magi_entities</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="toplink.ddl-generation" value="create-tables"/>
        </properties>
    </persistence-unit>

</persistence>

このファイルを構成する方法をインターネットで見つけようとしましたが、問題がどこにあるのかわかりませんでした。誰かがアイデアやチュートリアル、この獣の仕組みをよりよく理解するのに役立つ手動リンクを持っているかもしれません =)

4

2 に答える 2

4

リソースの注入は、Bean の作成中には発生しませんが、Bean がコンテナーによって注入されるときに発生します。つまり、 Bean コンストラクターが呼び出された後にリソースが注入されます。

次の注釈が付けられたメソッドでテストを実行する必要があります@PostConstruct

@PostConstruct
public void init() {
    if (this.em == null) {
        System.err.println("NULL");
    }
}

リンクされたJavaDocに書かれているように:

PostConstruct アノテーションは、依存性注入が完了した後に実行する必要があるメソッドで使用されます


以下のコメントに基づいて編集します。

万が一、Bean のコンストラクターを使用して自分で Bean をインスタンス化しようとすると、注入は失敗します。エンタープライズ Java Bean (Bean など) を使用する方法は、アノテーションを使用@Statelessして注入するか、JNDI ルックアップを使用することです。@EJB別のコンテナー管理オブジェクト (JSF Bean や CDI Bean など) に Bean を注入する必要があることに注意してください。

詳細については、このリンクを参照してください。

于 2013-07-04T06:11:55.483 に答える
0

私は最近同じ問題を抱えていました。

jdbc リソースへの JNDI ref を作成する必要がありました。

ここに私の追加の構成があります。

glassfish-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD 
GlassFish Application Server 3.1 Servlet 3.0//EN" 
"http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
 <session-config>
  <session-manager />
 </session-config>
 <resource-ref>
  <res-ref-name>java:app/env/mysql</res-ref-name>
  <jndi-name>java:jdbc/mysql</jndi-name>
  <!-- My JDBC Resource -->
 </resource-ref>
 <jsp-config />
</glassfish-web-app>

そして私の web.xml :

<data-source>
  <name>java:app/env/mysql</name>
  <class-name>com.mysql.jdbc.jdbc2.optional.MysqlDataSource</class-name>
  <database-name>psi</database-name>
  <user>user</user>
  <password>pass</password>

 </data-source>
于 2013-07-04T15:45:10.150 に答える