最近工作中处理一个对于资源引用的问题,主要问题是在resource-ref引用资源可以成功,换成resource-env-ref引用资源就会导致Naming Not Found 。。。 于是就开始Google 这两者的不同,到底是什么原因导致问题出现呢?跟了几遍代码,发现是在处理过程中对于resource-env-ref的定义是
Element |
Required |
Description |
only one |
Specifies the res-ref-name in the corresponding Java EE deployment descriptor fileresource-env-ref entry. |
|
only one |
Specifies the absolute jndi-name of a resource. |
但在Runtime Descriptor(sun-web.xml)中写成了res-env-ref-name,相应的这个标签是没有定义的,所以保存在服务器的动态属性中的是以res-env-ref-name为key来保存,
Dynamic Attribute
Property name = JndiName value = myjndi
Property name = res-env-ref-name value = aaa
<==End]
而不是定义的RESENVREFNAME,所以调用其相应的get方法会返回空,导致相应的关联没有创建。
问题分析完了,通过更正相应配置文件中的属性名来解决。
但是这两者之间的区别到底是什么呢,还是不清楚。于是又Google了几次,大概明白了。
区别主要是:
- Resource reference, which is typically to an object factory for resources such as a JDBC DataSource, a JavaMail Session, or custom object factories configured into Tomcat. -
Resource environment reference, a new variation of resource-ref added in Servlet 2.4 that is simpler to configure for resources that do not require authentication information.
resource-ref 连接工厂管理对象:表示连接工厂的资源。该连接通常在驱动程序和池提供的容器管理的实施。目前,有5个标准的Java EE运行时连接工厂:
JDBC | javax.sql.DataSource | java:comp/env/jdbc/[pfad] |
JMS | javax.jms.TopicConnectionFactory, javax.jms.QueueConnectionFactory | java:comp/env/jms/[pfad] |
JavaMail | javax.mail.Session | java:comp/env/mail/[pfad] |
URL | java.net.URL | java:comp/env/url/[pfad] |
JAXR ResourceAdapter | javax.xml.registry.ConnectionFactory | java:comp/env/eis/JAXR/[pfad] |
JCA Outbound Resource Adapter | a.b.c.MyConnectionFactory |
java:comp/env/eis/[pfad]
|
web.xml样例:
<resource-ref> <res-ref-name>jdbc/petShopDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
应用服务器Runtime Descriptor样例:
<resource-ref>
<res-ref-name>jdbc/DefaultDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<jndi-name>java:/DefaultDS</jndi-name>
</resource-ref>
<resource-ref>
<res-ref-name>mail/DefaultMail</res-ref-name>
<res-type>javax.mail.Session</res-type>
<jndi-name>java:/Mail</jndi-name>
</resource-ref>
这两个文件中的res-ref-name要一致
resource-env-ref 目标管理的对象:这些资源是直接寻址(无状态)。每个容器必须JMS队列和JMS主题作为管理对象提供的,默认情况下,他们下的java:comp / env的/ JMS提供。完成在Deploymentdescriptor声明的resource-env-ref的元素
web.xml中的内容把上面的resource-ref换成resource-env-ref即可,
<resource-env-ref> <resource-env-ref-name>jms/pets/stockQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref>
应用服务器描述文件: <resource-env-ref> <resource-env-ref-name>jms/StockInfo</resource-env-ref-name> <jndi-name>queue/StockInfoQueue</jndi-name> </resource-env-ref>
以上是两者的区别与样例。
在StackOverFlow中对于每种资源应该使用哪种引用还有个列表:
Java Type Equivalent Resource type java.lang.String env-entry java.lang.Character env-entry java.lang.Integer env-entry java.lang.Boolean env-entry java.lang.Double env-entry java.lang.Byte env-entry java.lang.Short env-entry java.lang.Long env-entry java.lang.Float env-entry javax.xml.rpc.Service service-ref javax.xml.ws.Service service-ref javax.jws.WebService service-ref javax.sql.DataSource resource-ref javax.jms.ConnectionFactory resource-ref javax.jms.QueueConnectionFactory resource-ref javax.jms.TopicConnectionFactory resource-ref javax.mail.Session resource-ref java.net.URL resource-ref javax.resource.cci.ConnectionFactory resource-ref org.omg.CORBA_2_3.ORB resource-ref any other connection factory defined by a resource adapter resource-ref javax.jms.Queue message-destination-ref javax.jms.Topic message-destination-ref javax.resource.cci.InteractionSpec resource-env-ref javax.transaction.UserTransaction resource-env-ref Everything else resource-env-ref
以下是参考的几篇文件,都很不错:
http://stackoverflow.com/questions/7254277/jee6-what-can-be-injected-with-resource
http://www.prozesse-und-systeme.de/jndiResourcen.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-resources-howto.html
相关推荐
ELEMENT resource-env-ref (resource-env-ref-name, resource-env-ref-type) >。 resource-ref 元素用于定义资源引用,<!ELEMENT resource-ref (res-ref-name, res-type, res-auth) >。security-constraint 元素...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 同时,我们还需要在 `WEB-INF/web.xml` 文件中添加资源引用,例如: ```xml <resource-ref> <description>DB ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 然后在应用代码中,可以通过以下方式获取数据源: ```java InitialContext ic = new InitialContext(); ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` #### 17. `resource-ref`元素 `resource-ref`元素用于引用外部资源,如数据库连接池或消息队列。DTD定义如下: ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 然后在Servlet中通过`Context`查找并使用这个数据源: ```java Context initCtx = new InitialContext(); Context ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` ##### 2.16 `<resource-ref>` - **定义**:引用一个外部资源。 - **用途**:如数据库连接池等。 - **属性**: ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` #### <resource-ref> - **作用**:声明一个外部资源的引用,通常用于数据库连接池或邮件会话。 - **示例**: ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/...
- `resource-env-ref`: 声明与资源相关的管理对象。 - `resource-ref`: 声明外部资源。 - `security-constraint`: 指定需要保护的URL路径。 - `login-config`: 配置认证机制,用于用户登录验证。 - `security-role`:...
在这个文件中,使用`resource-ref`元素将资源引用名称与数据源的JNDI名称关联起来。 ```xml <resource-ref> <res-ref-name>jdbc/DataSource</res-ref-name> <jndi-name>jdbc/real</jndi-name> </resource-ref> ...
<resource-env-ref-name>jdbc/myDataSource</resource-env-ref-name> </resource-env-ref> ``` 15. **`<resource-ref>`** - **作用**:声明外部资源的引用。 - **示例**: ```xml <resource-ref> ...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 然后在`context.xml`或`server.xml`中定义具体的DataSource配置,包括数据库URL、用户名、密码以及c3p0的配置参数...
- 示例:`<resource-env-ref><resource-env-ref-name>jdbc/myDataSource</resource-env-ref-name><resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type></resource-env-ref>`。 16. **resource-...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 接着,在Tomcat的`conf/server.xml`文件中,添加一个`Resource`元素,指定数据库连接的详细信息: ```xml ... ...
- **`<resource-env-ref>`**:声明与资源相关的管理对象。 - **`<resource-ref>`**:声明外部资源的引用,这些资源由资源工厂提供。 - **示例**: ```xml <resource-ref> <description>Resource Reference for DB...
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 在服务器配置中(如Tomcat的context.xml),添加对应的DataSource定义: ```xml <Resource name="jdbc/...
15. `<resource-env-ref>`:resource-env-ref 元素用于声明与资源相关的一个管理对象。 16. `<resource-ref>`:resource-ref 元素用于声明一个资源工厂使用的外部资源。 17. `<security-constraint>`:security-...
<resource-env-ref-name>jdbc/MyDataSource</resource-env-ref-name> </resource-env-ref> ``` **用途**: 引用已部署的资源。 ##### 16. `<resource-ref>` 标签 **定义**: 声明一个资源工厂使用的外部资源。 **...
在web.xml文件中,添加了resource-ref配置:<resource-ref> <description>SQL Server Datasource</description> <res-ref-name>jdbc/DBUtil</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>...