2014-07-04 47 views
0

我有使用WebSphere 8.5的OpenJPA持久性單元的EJB應用程序。數據源是在WebSphere配置如下設置:是否有可能擺脫Websphere管理的DataSource額外的@Resource註解?

  • 範圍:細胞:pxxxxNodexxCell
  • 名稱:MYAPP_001
  • JNDI名稱爲:jdbc/MYAPP/DS001
  • 組件管理的認證別名:MYAPP_001
  • 映射配置別名:(無)
  • 容器管理認證別名:(無)

持久性單元被配置爲使得:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence 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_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="myapp" transaction-type="JTA"> 
     <jta-data-source>java:comp/env/jdbc/MYAPP/DS001</jta-data-source> 
     <class>...</class> 
     <properties> 
      ... 
     </properties> 
    </persistence-unit> 
</persistence> 

現在,我將其導入EJB:

@PersistenceContext(name = "myapp") 
private EntityManager em; 

的問題是,其具有以下配置中的數據源不能得到解決:

產生的原因: org.apache.openjpa.persistence.ArgumentException:持久 提供商正在試圖使用persistence.xml文件中的屬性 來解析數據源。必須在 openjpa.ConnectionDriverName或javax.persistence.jdbc.driver 屬性中指定Java數據庫連接(JDBC)驅動程序 或數據源類名稱。配置中提供以下屬性: 「WsJpaJDBCConfigurationImpl @ 83f2eb8d:PDQ已禁用:AccessIntent Task = disable」。在 org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:72) 在 org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:849) 在 有機apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:602) 在 org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1518) 在 org.apache.openjpa。 lib.conf.Configurations.configureInstance(Configurations.java:531) at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:456) at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:121) 在 org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68) 在 org.apache.openjpa .lib.conf.ObjectValue.instantiate(ObjectValue.java:83) 在 org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:967) 在 org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance (OpenJPAConfigurationImpl.java:958) at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:644) at org.apache.openjpa。 org.apache.openjpa.kernel。內核。抽象經紀人工廠。DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156) 在 org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227) 在 com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java: 72) 在 com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:35) 在 com.ibm.ws.jpa.management.JPAEMPool.getEntityManager(JPAEMPool.java:167) 在 COM .ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:247) at com.ibm.ws.jpa.management.JPATxEntityManag er.getEMInvocationInfo在 com.ibm.ws.jpa.management.JPAEntityManager.createQuery(JPAEntityManager.java:299)(JPATxEntityManager.java:179)

我需要什麼,是提供DataSource資源映射任何使用EJB的的EntityManager

@Resource(name = "java:comp/env/jdbc/MYAPP/DS001", lookup = "jdbc/MYAPP/DS001", shareable = true, authenticationType = Resource.AuthenticationType.CONTAINER) 
private DataSource ds; 

這對我來說非常unelegant的解決方案,這是因爲:

  1. 這很混亂。它只需要聲明一次,在任何的EJB使用@PersistenceContext。在Java代碼中可能不會使用DataSource,在我的情況下它不被使用。很難理解該聲明在該文件中的作用,以及爲什麼它只在一個文件中。

  2. 它重複了在其他地方提供的配置。我需要再次指定資源的名稱(它已經在persistance.xml中指定)。

  3. 它將配置存儲在源代碼中。相當髒的反模式。

  4. 從技術上講,它需要來自Java 7的javax.annotation.Resource,而我的項目使用Java 6.但是WebSphere運行時修改了該註釋的版本,所以一切正常,但需要使用WebSphere運行時的javac進行編譯,而不是標準JDK。

是否有可能擺脫該註釋?我需要使用什麼作爲替代方案?

回答

2

java:comp/env/format表示資源引用,所以不知何故,您必須定義它。你有幾個選項,不能定義一個虛擬數據源:

1.定義在類級別的資源 - 這是完全支持Java 6中 - 它正確地定義了資源引用:

@Resource(name="jdbc/dsRef", type=javax.sql.DataSource.class, lookup="jdbc/DS") 
public class MyBean implements MyBeanLocal { 

對此和你的代碼進行更多的說明 - 實際上你應該給出一個參考名稱(沒有java:comp/env),然後在persistence.xml中輸入java:comp/env/refName。查找定義在服務器上註冊的實際JNDI名稱。您可以跳過定義查找並在安裝期間或通過綁定文件將引用綁定到資源。

2。使用部署描述符

創建部署描述符(web.xml或ejb-jar.xml)併爲其中的每個EJB定義資源引用。您將不再需要在您的班級中使用@Resource的數據源。在所有

3.不使用的參考。雖然我不推薦它,你可以在persistence.xml中使用的實際服務器的JNDI數據源名稱。然後,您不需要在EJB中使用DataSource,因爲不使用任何參考。

<jta-data-source>jdbc/MYAPP/DS001</jta-data-source> 

但這樣一來,你就不會在該應用程序使用數據源管理控制檯看,你將無法在需要時該映射更改爲不同的數據源JNDI名稱。

而在澄清您的評論的:

從技術上講,它需要從Java 7 javax.annotation.Resource,而 我的項目是使用Java 6,但WebSphere運行時改變帽子 版本註釋,所以一切都是工作,但需要 與WebSphere運行時的javac編譯,而不是標準的JDK

javax.annotation.Resource是Java EE 6的,這是由WebSphere實施的一部分。您不需要Java v7,而是完全投訴的Java EE 6應用程序服務器。您正在創建Java EE應用程序而不是Java SE應用程序。這就是爲什麼你需要容器​​類來解決這個註釋。它沒有任何「改變」由WebSphere,只是遵循規範。

+0

這是所有偉大的信息。澄清一下,直到Java SE 7才加入@Resource(lookup = ...),但它是EE 6所必需的,所以應用程序服務器(包括WAS)會覆蓋這個註解類。這確實會導致編譯的複雜性,但正如您所建議的那樣,您可以在DD或綁定(bnd文件或部署)中使用諸如lookup-name之類的替代方法。 –

相關問題