我有使用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的解決方案,這是因爲:
這很混亂。它只需要聲明一次,在任何的EJB使用
@PersistenceContext
。在Java代碼中可能不會使用DataSource
,在我的情況下它不被使用。很難理解該聲明在該文件中的作用,以及爲什麼它只在一個文件中。它重複了在其他地方提供的配置。我需要再次指定資源的名稱(它已經在persistance.xml中指定)。
它將配置存儲在源代碼中。相當髒的反模式。
從技術上講,它需要來自Java 7的
javax.annotation.Resource
,而我的項目使用Java 6.但是WebSphere運行時修改了該註釋的版本,所以一切正常,但需要使用WebSphere運行時的javac進行編譯,而不是標準JDK。
是否有可能擺脫該註釋?我需要使用什麼作爲替代方案?
這是所有偉大的信息。澄清一下,直到Java SE 7才加入@Resource(lookup = ...),但它是EE 6所必需的,所以應用程序服務器(包括WAS)會覆蓋這個註解類。這確實會導致編譯的複雜性,但正如您所建議的那樣,您可以在DD或綁定(bnd文件或部署)中使用諸如lookup-name之類的替代方法。 –