Glassfish:无法使用glassfish-web.xml将数据源JNDI名称映射到可移植名称 [英] Glassfish: Unable to map datasource JNDI name to portable name using glassfish-web.xml
问题描述
我试图在Glassfish AS 3.x和JBoss AS 6之间建立一个Java EE 6 webapp可移植性,因为每个服务器都以不同的方式映射数据源的JNDI名称,所以我需要在persistence.xml中为数据源指定应用程序专用的内部名称,然后使用glassfish-web.xml或jboss-web.xml(根据需要)将其映射为实际数据源名称在服务器中。
理论很简单(对于EE):
$ ul
遗憾的是,对于我来说,我无法在Glassfish AS 3.1,3.1.1,3.2 beta,JBoss AS 6或JBoss AS 7 beta中使用它。我现在正专注于在Glassfish上开展工作。
Glassfish在报告无效资源:my-datasource__pm时试图部署引用my- datasource在persistence.xml中:
<?xml version =1.0encoding =UTF-8?>
< persistence version =2.0xmlns =http://java.sun.com/xml/ns/persistencexmlns:xsi =http://www.w3.org/2001/XMLSchema-实例xsi:schemaLocation =http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">
< persistence-unit name =org.example_glassfish-webxml-datasource-jndi-mapping_war_1.0-SNAPSHOTPUtransaction-type =JTA>
< jta-data-source> my-datasource< / jta-data-source>
< exclude-unlisted-classes> false< / exclude-unlisted-classes>
< properties />
< / persistence-unit>
< /余辉>
并通过web.xml将其映射到已知的现有数据源:
<?xml version =1.0encoding =UTF-8?>
< web-app version =3.0xmlns =http://java.sun.com/xml/ns/javaee
xmlns:xsi =http://www.w3。 org / 2001 / XMLSchema-instance
xsi:schemaLocation =http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web- app_3_0.xsd>
<! - servlet声明等消失... - >
< resource-ref>
< res-ref-name> my-datasource< / res-ref-name>
< res-type> javax.sql.DataSource< / res-type>
< res-auth>容器< / res-auth>
< res-sharing-scope>可分享< / res-sharing-scope>
< / resource-ref>
< / web-app>
...和glassfish-web.xml:
<?xml version =1.0encoding =UTF-8?>
<!DOCTYPE glassfish-web-app PUBLIC - // GlassFish.org //DTD GlassFish Application Server 3.1 Servlet 3.0 // ENhttp://glassfish.org/dtds/glassfish-web-app_3_0 -1.dtd>
< glassfish-web-app error-url =>
< resource-ref>
< res-ref-name> my-datasource< / res-ref-name>
< jndi-name> realdsname< / jndi-name>
< / resource-ref>
< / glassfish-web-app>
asadmin list-jndi-entries显示实际的数据源JNDI名称, web.xml以及使用Glassfish生成的__pm后缀列出另一个条目:
$ asadmin list-jndi-条目
....无关的输出....
realdsname__pm:javax.naming.Reference
realdsname:javax.naming.Reference
不用说,这让我完全陷入了困境。关于我缺少的任何想法?
好的,情况就是这样。
这不应该起作用(请参阅 http://java.net/jira/browse / GLASSFISH-17024 ),显然没关系。
显然,每个人都在注释中定义他们的数据源,在web.xml< data-source />子句,或只是针对一个应用程序服务器。尽管对于@Resource注入,JNDI查找,Spring等来说,所有映射的东西对于JPA来说都是完全不起作用的。
我已经将这添加到了我的已经太长了 Java EE 6疣和陷阱页面。
I'm going slightly insane trying to make a Java EE 6 webapp portable between Glassfish AS 3.x and JBoss AS 6 (and 7 when released).
Because each server maps JNDI names for datasources differently, I need to specify an application-private internal name for the datasource in persistence.xml then use glassfish-web.xml or jboss-web.xml (as appropriate) to map that to a real datasource name in the server.
The theory is simple (well, for EE):
- Use internal name in persistence.xml, eg "my-datasource"
- Add a resource-ref entry to web.xml declaring that your app needs a resource called "my-datasource"
- Add a mapping in glassfish-web.xml and jboss-web.xml with the appropriate server's syntax, declaring that "my-datasource" should be mapped to the app server provided data source named "real-DS-created-by-admin"
Unfortunately, the theory is about as far as it goes, because for the life of me I cannot make it work in Glassfish AS 3.1, 3.1.1, 3.2 beta, JBoss AS 6, or JBoss AS 7 beta. Right now I'm focusing on getting it working on Glassfish.
Glassfish reports "Invalid resource : my-datasource__pm" when I try to deploy an app that references "my-datasource" in persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<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="org.example_glassfish-webxml-datasource-jndi-mapping_war_1.0-SNAPSHOTPU" transaction-type="JTA">
<jta-data-source>my-datasource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
and maps it to a known existing datasource via web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- servlet declarations etc elided ... -->
<resource-ref>
<res-ref-name>my-datasource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
</web-app>
... and 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 error-url="">
<resource-ref>
<res-ref-name>my-datasource</res-ref-name>
<jndi-name>realdsname</jndi-name>
</resource-ref>
</glassfish-web-app>
"asadmin list-jndi-entries" shows the actual datasource JNDI name exactly as it appears in glassfish-web.xml as well as listing another entry with a "__pm" suffix that's generated by Glassfish:
$ asadmin list-jndi-entries
.... unrelated output ....
realdsname__pm: javax.naming.Reference
realdsname: javax.naming.Reference
Needless to say, this is driving me completely up the wall. Any ideas on what I'm missing?
OK, here's the situation.
It's not supposed to work (see http://java.net/jira/browse/GLASSFISH-17024) and apparently that's OK.
Apparently everybody defines their data sources in annotations, in web.xml <data-source/> clauses, or just targets only one app server. All the mapping stuff is completely non-functional for JPA even though it works fine for @Resource injection, JNDI lookups, Spring, etc.
I've added this to my already-way-too-long java EE 6 warts and traps page.
这篇关于Glassfish:无法使用glassfish-web.xml将数据源JNDI名称映射到可移植名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!