Could not bind factory to JNDI?

sunsnow8 2005-08-04 04:52:06
[@APPNAME@] INFO [main] NamingHelper.getInitialContext(26) | JNDI InitialContext properties:{}
[@APPNAME@] WARN [main] SessionFactoryObjectFactory.addInstance(98) | Could not bind factory to JNDI
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getNameParser(Unknown Source)
at org.hibernate.util.NamingHelper.bind(NamingHelper.java:52)
at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:90)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:292)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1033)
at rg.common.HibernateUtil.<clinit>(HibernateUtil.java:23)
at rg.myHibernateApp.business.UserBusiness.findOneUser(UserBusiness.java:45)
at rg.test.testUserBusiness.testFindOneUser(testUserBusiness.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
[@APPNAME@] INFO [main] SessionFactoryImpl.checkNamedQueries(411) | Checking 0 named queries
...全文
577 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2005-09-17
  • 打赏
  • 举报
回复
它会尝试 读入上面列的那几个 .properties 文件。 找到 javax.naming.Context 中需要的那些参数值。

你只要在相应的位置放置 相应的 properties 就行了。
PROVIDER_RESOURCE_FILE_NAME = "jndiprovider.properties";
APP_RESOURCE_FILE_NAME = "jndi.properties";
JRELIB_PROPERTY_FILE_NAME = "jndi.properties";

有些是从 /META-INF/ 或者 /META-INF/services/ 目录读, 这也是 jar 比 zip 格式新增的东西,Jar 类提供读取功能。
从它们常量名能看出这些文件应该位于 JRE/lib 还是应用程序的 classpath 中。



humanity 2005-09-17
  • 打赏
  • 举报
回复
我觉得当你从一个 有 资源管理实现的 应用服务器启动 Web 服务时, 这些设置应该已经被 应用服务器在 命令行或 properties 中初始化过了。

请查看如下 JNDI 初始化 配置资源 类片断:
这是 Sun 默认的 JNDI SPI 初始化的。不同的服务器提供不同的 SPI 工厂类,也就是 java.naming.factory.initial 的值 。
然后结合 javax.naming.Context 中的一些常量, 比较一下。

package com.sun.naming.internal;
public final class ResourceManager {

/*
* Name of provider resource files (without the package-name prefix.)
*/
private static final String PROVIDER_RESOURCE_FILE_NAME =
"jndiprovider.properties";

/*
* Name of application resource files.
*/
private static final String APP_RESOURCE_FILE_NAME = "jndi.properties";

/*
* Name of properties file in <java.home>/lib.
*/
private static final String JRELIB_PROPERTY_FILE_NAME = "jndi.properties";
}


在 classes/放置一个 jndi.properties 文件,
里面写着
java.naming.factory.initial = 这里应该是你的应用服务器具体使用的 工厂名。

如果我使用OpenLDAP 它就是com.sun.jndi.ldap.LdapCtxFactory .

java.naming.provider.url = 你服务器 JNDI 地址及端口. 如 : ldap://localhost:369 不同实现可以不一样。

java.naming.security.authentication = simple / none / xx/yy 认证方式 , none 是匿名. simple 是简单用户名、密码不加密

java.naming.security.principal = 用户名。

java.naming.security.credentials = 密码( 或证书当你使用其它认证方式时)



这些条目 都从 javax.naming. Context. 中拷贝的, 自己看看 javax.naming.Context 类文档。


深圳万兴 2005-09-16
  • 打赏
  • 举报
回复
调用jndi时,你要配置一下,这样访问时通过jndi名字就可访问到数据库了
不同的服务,配置的方法不一样...
zhl7522 2005-08-19
  • 打赏
  • 举报
回复
tanguangbin(明朝酒醒何处,杨柳岸,晓风残月) 高手中的高手,请说明为什么啊?向你学习
mingr6370 2005-08-07
  • 打赏
  • 举报
回复
mark
den_dyj 2005-08-06
  • 打赏
  • 举报
回复
楼上完全同意啊
tanguangbin 2005-08-05
  • 打赏
  • 举报
回复
不知道你用的是不是WEB 服务器的连接池? 也不知道你的具体问题是什么,所以只给你一个提示吧.
你的问题是你的JNDI 的名字无效的,如果你用的TOMCAT 的那你的HIBERNATE的配置应该是 "java:/comp/env/YOURJNID", 如果是WEBLOGIC 或是 JBOSS , WEBSPHERE 等应用服务器不需要加"java:/comp/env"前缀,直接写YOURJNID名字就可以了.

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧