java – 如何使JNDI名称与GlassFish和WildFly兼容
我正在开发
Java EE 7应用程序,并且要求将应用程序部署到运行GlassFish 4.0或WildFly 8.1.0的应用程序服务器上.我得到的问题是GlassFish和WildFly对JNDI名称使用略有不同的格式,但我看不出如何使我的应用程序兼容两者.
在GlassFish中,我的persistence.xml文件引用数据源jdbc / myDataSouce,但在WildFly中,数据源需要是java:/ jdbc / myDataSource. 对于使用@Resource注释的类也是如此.在GlassFish中,使用JavaMail的类的注释将是@Resource(name =“mail / myMailSession”),但要部署到WildFly,这需要是@Resource(name =“java:mail / myMailSession”). 我知道我可以解压缩EAR和JAR文件以手动编辑文件,例如persistence.xml,但我不能对已经使用@Resource注释的类执行此操作. 有没有办法可以将我的编译应用程序部署到GlassFish和WildFly上,而无需维护两个不同版本的代码?我假设答案可能取决于特定于应用程序的部署描述符,但我找不到任何涵盖这两种情况的示例. 有人能指出我正确的方向吗? 解决方法
您可以修改Wildfly JNDi名称并从相应的JNDI名称中删除不需要的前缀,以查找两个应用程序服务器中的最小公分母.以下适用于Glassfish和JBoss AS 7.1.由于我希望Wildfly在这方面与JBoss向后兼容,我想它也适用于Wildfly.
坚持 注入: @PersistenceContext(unitName="TestPU") private EntityManager entityManager; 或者通过ejb-jar.xml: <persistence-context-ref> <persistence-context-ref-name>entityManager</persistence-context-ref-name> <persistence-unit-name>TestPU</persistence-unit-name> <injection-target> ... </injection-target> </persistence-context-ref> 相应的persistence.xml: <persistence version="2.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_2_0.xsd"> <persistence-unit name="TestPU" transaction-type="JTA"> <jta-data-source>datasources/TestDS</jta-data-source> <class>org.jeeventstore.persistence.jpa.EventStoreEntry</class> <properties> <property name="hibernate.show_sql" value="false"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <property name="hibernate.connection.charSet" value="UTF-8"/> <property name="eclipselink.logging.level" value="FINE"/> <property name="eclipselink.logging.level.sql" value="FINE"/> <property name="eclipselink.logging.parameters" value="true"/> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> </properties> </persistence-unit> </persistence> (注意简单的jta-data-source JNDI名称) 这是一个glassfish-resources.xml文件,用于在部署时指定Derby数据库,类似的设置可用于MySQL或Postgres. <resources> <jdbc-resource pool-name="ArquillianEmbeddedDerbyPool" jndi-name="datasources/TestDS"/> <jdbc-connection-pool name="ArquillianEmbeddedDerbyPool" res-type="javax.sql.DataSource" datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource" is-isolation-level-guaranteed="false"> <property name="databaseName" value="target/databases/derby"/> <property name="createDatabase" value="create"/> </jdbc-connection-pool> </resources> 以及JBoss standalone.xml中的设置: <datasource jta="true" jndi-name="java:/datasources/TestDS" pool-name="TestDS" enabled="true" use-ccm="false"> <connection-url>jdbc:postgresql://localhost/test_db</connection-url> ... </datasource> 资源 我没有在Glassfish上注入JavaMail组件,但是类似于datasoruce设置,尝试从@Resource注释中剥离“java:”部分也是值得的. @Resource(name = "mail/myMailSession") 然后配置Wildfly,以便邮件资源在“java:mail / myMailSession”JNDI位置可用. 通过ejb-jar.xml注入 另一个选择是通过ejb-jar.xml文件手动注入字段,然后使用maven等构建工具将ejb-jar-glassfish.xml或ejb-jar-wildfly.xml中的任何一个复制到所需的ejb-汇编时的jar.xml. 在我们的一个项目中,我们使用混合方法来避免xml配置的负担:我们通过ejb-jar.xml配置少量“提供者”bean,例如将持久化上下文注入到PersistenceContextProvider中,然后使用CDI通过@EJB将PersistenceContextProvider注入EJB,无需进一步配置即可找到它们,因为它们位于同一个EAR中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |