1

Web サービスが呼び出されると、次のエラーが発生します。

org.apache.openjpa.persistence.ArgumentException: A JDBC Driver or DataSource class name must be specified in the ConnectionDriverName property.

Webservice クラスは基本的に JPA を使用してデータを挿入しようとしています。上記のエラー メッセージに基づいて、以下に示すように EntityManager がデータソース エントリにアクセスできないようです。

<persistence-unit name="TEST_P" transaction-type="RESOURCE_LOCAL"> 
        <provider>
        com.ibm.websphere.persistence.PersistenceProviderImpl
        </provider>
        <non-jta-data-source>java:comp/env/jdbc/DATA</non-jta-data-source>
        <class>jpa.WSTGHandler</class>
            <properties>

        </properties>
    </persistence-unit>

また、以下に示すように、web.xml でデータソース エントリを定義しました。

      <resource-ref>
        <res-ref-name>java:comp/env/jdbc/DATA</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>

In Servlet に JPA コードを埋め込むと、データソースが正常に検索されます。どうすれば Webservice を同じように動作させることができますか?

PS: Websphere 7、JPA バージョン 1.2、および JAX-WS を使用しています。

要求に応じて、次のクラスが Web サービス メソッド、つまり beginTransaction() で呼び出されます。

public class EntityManagerHelper {

    private static final EntityManagerFactory emf; 
    private static final ThreadLocal<EntityManager> threadLocal;
    private static final Logger logger;

    static {
        emf = Persistence.createEntityManagerFactory("TEST_P");         
        threadLocal = new ThreadLocal<EntityManager>();
        logger = Logger.getLogger("TEST_P");
        logger.setLevel(Level.FINE);
    }

    public static EntityManager getEntityManager() {
        EntityManager manager = threadLocal.get();      
        if (manager == null || !manager.isOpen()) {
            manager = emf.createEntityManager();
            threadLocal.set(manager);
        }
        return manager;
    }

     public static void closeEntityManager() {
        EntityManager em = threadLocal.get();
        threadLocal.set(null);
        if (em != null) em.close();
    }

    public static void beginTransaction() {
        getEntityManager().getTransaction().begin();
    }

    public static void commit() {
        getEntityManager().getTransaction().commit();
    }  

    public static void rollback() {
        getEntityManager().getTransaction().rollback();
    } 

    public static Query createQuery(String query) {
        return getEntityManager().createQuery(query);
    }

    public static void log(String info, Level level, Throwable ex) {
        logger.log(level, info, ex);
    }

}
4

1 に答える 1

0

問題は解決された。res-ref-name の単なるタイプミスでした :)

于 2012-04-17T17:46:12.870 に答える