最近在OC4J 10g引用了weblogic10的jar包时,发现Local对象无法获取,总是报javax.naming.NameNotFoundException,于是分析了一下context.lookup是如何执行的。
在获取Local bean时,所用语句如下:
final InitialContext context = new InitialContext();
String jndiName = "java:comp/env/ejb/BusinessLocal";
Object object = context.lookup(jndiName );
解析new InitialContext();
new InitialContext()à
myProps =
ResourceManager.getInitialEnvironment(environment); à
String[]
jndiSysProps = helper.getJndiProperties();à
System.getProperties();
myProps的值为:
{java.naming.factory.initial=com.evermind.server.ApplicationInitialContextFactory,
java.naming.factory.url.pkgs=oracle.oc4j.naming.url:weblogic.jndi.factories:weblogic.corba.j2ee.naming.url}
解析context.lookup(jndiName );
context.lookup(jndiName ) à
context.getURLOrDefaultInitCtx(String
name); à
NamingManager.getURLContext(scheme,
myProps); à
NamingManager.getURLObject(scheme,
null, null, null, environment); à
ResourceManager.getFactory(
Context.URL_PKG_PREFIXES, environment, nameCtx,
"."+scheme+"."+scheme+"URLContextFactory",defaultPkgPrefix);
分析ResourceManager.getFactory()源码
public static Object getFactory(String propName, Hashtable env,
Context ctx, String classSuffix, String defaultPkgPrefix)
throws NamingException {
// Merge property with provider property and supplied default
//从env获取java.naming.factory.url.pkgs的值
String facProp = getProperty(propName, env, ctx, true);
if (facProp != null)
facProp += (":" + defaultPkgPrefix); //注意在此时加上了默认的sun的com.sun.jndi.url
else
facProp = defaultPkgPrefix;
// Cache factory based on context class loader, class name, and
// property val
ClassLoader loader = helper.getContextClassLoader(); //此时loader为simple.root:0.0.0
String key = classSuffix + " " + facProp;
Map perLoaderCache = null;
synchronized (urlFactoryCache) {
perLoaderCache = (Map) urlFactoryCache.get(loader);
if (perLoaderCache == null) {//第一次perLoaderCache为null
perLoaderCache = new HashMap(11);
urlFactoryCache.put(loader, perLoaderCache);
}
}
synchronized (perLoaderCache) {
Object factory = null;
WeakReference factoryRef = (WeakReference) perLoaderCache.get(key);
if (factoryRef == NO_FACTORY) {
return null;
} else if (factoryRef != null) {//第一次factoryRef为null
factory = factoryRef.get();
if (factory != null) { // check if weak ref has been cleared
return factory;
}
}
// Not cached; find first factory and cache
StringTokenizer parser = new StringTokenizer(facProp, ":");
String className;
while (factory == null && parser.hasMoreTokens()) {
className = parser.nextToken() + classSuffix;
/* 这里className 的值分别为
oracle.oc4j.naming.url.java.javaURLContextFactory
weblogic.jndi.factories.java.javaURLContextFactory
weblogic.corba.j2ee.naming.url.java.javaURLContextFactory
com.sun.jndi.url.java.javaURLContextFactory */
try {
// System.out.println("loading " + className);
factory = helper.loadClass(className, loader).newInstance();
} catch (InstantiationException e) {
//略
} catch (IllegalAccessException e) {
//略
} catch (Exception e) {
// ignore ClassNotFoundException, IllegalArgumentException,
// etc.
}
}
// Cache it.
perLoaderCache.put(key, (factory != null) ? new WeakReference(
factory) : NO_FACTORY);
return factory;
}
}
最后factory.getObjectInstance(urlInfo, name, nameCtx, environment);
当不加载weblogic的jar包时,
java.naming.factory.url.pkgs=oracle.oc4j.naming.url;
当className=oracle.oc4j.naming.url.java.javaURLContextFactory,返回的factory=null,所以最终使用的Factory是com.sun.jndi.url.java.javaURLContextFactory,这个时候没有问题;
当加载weblogic的jar包时,
java.naming.factory.url.pkgs=
oracle.oc4j.naming.url:
weblogic.jndi.factories:
weblogic.corba.j2ee.naming.url
使用的Factory是
weblogic.jndi.factories.java.javaURLContextFactory
而在获取Local
bean时抛出javax.naming.NameNotFoundException。
分享到:
相关推荐
DataSource ds = (DataSource)initCtx.lookup("java:comp/env/myoracle"); ``` 这里的`java:comp/env/myoracle`是JNDI(Java Naming and Directory Interface)路径,`myoracle`对应`context.xml`中的`name`属性。 ...
import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; import java.sql.Connection; // 获取初始上下文 Context ctx = new InitialContext(); // 查找环境上下文 ...
dns-lookup- dns.lookup替换dns.lookup标准方法的DNS缓存 超级简单易用 const request = require ( 'request' ) ; const { lookup } = require ( 'dns-lookup-cache' ) ; // With "request" module request ( { url...
使用lookup选项 const http = require ( 'http' ) ; const CacheableLookup = require ( 'cacheable-lookup' ) ; const cacheable = new CacheableLookup ( ) ; http . get ( 'http://example.com' , { lookup : ...
lookup-dns- dns.lookup替换dns.lookup标准方法的DNS缓存超级简单易用const request = require ( 'request' ) ;const { lookup } = require ( 'lookup-dns-cache' ) ;// With "request" modulerequest ( { url : '...
Axios使用node.js dns.lookup解析主机名。 dns.lookup是同步的,并且在有限的libuv线程池上执行。 每个axios请求都将解析kubernetes,openshift和云环境中的dns名称,这些dns名称是故意将TTL设置为低或设置为0以...
import javax.naming.Context; import javax.naming.InitialContext; public class QueueSend { public static void main(String[] args) { try { // 创建JNDI上下文 Hashtable, String> properties = new ...
requestUtils lookup方法简介
资源包含两个jar包,一个是httpclient,一个是httpcore. http接口需要的jar包,可以查看博客:https://blog.csdn.net/qq_25814003/article/details/80749287
ADOQuery添加了lookup字段后使用Append,再为字段赋值时会报错“EOleException 未知错误”,很困扰啊,终于能解决了。
geoip-lookup 公开 2 个简单的 API, .lookup和.match 。 两者都是异步的,但.match将“阻止”回调,直到它检索到信息。 如果数据没有缓存在 LevelUp 本地数据库中,一旦数据被检索, .lookup将返回一个未定义的...
运行Phoenixclient所需架包-包含报错所需架包,文章:Phoenix API Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/config/Lookup所需要资源
RevitLookup是一款强大的Revit插件,主要用于Revit模型的检查、分析和调试。这款工具在Revit二次开发领域有着广泛的应用,可以帮助开发者和设计师深入理解Revit模型的数据结构,提高工作效率。RevitLookup-2020.0....
(Accsubjdoc) NCLocator.getInstance().lookup(Accsubjdoc.class.getName()); nc.vo.bd.b02.AccsubjVO[] targetSubjVos = itf.queryAccsubjVOs(pk_glorgbook, null, false); AccperiodVO //查询会计期间 AccperiodVO...
Object ref = jndiContext.lookup("HelloWorldHome"); HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow (ref, HelloWorldHome.class); //用EJB生成库Home生成EJB对象 HelloWorld...
import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class Connect { public static Connection getconnect() { Connection cn = null; try { System.out...
用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2019下即可。(如果不能正常使用,请用Visual Studio打开源码,将项目所需的引用更新到正确的路径,编译生成RevitLookup.dll...
RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5
RevitLookup是一款强大的Revit插件,主要用于Revit二次开发中的调试和分析工具。它能够帮助用户在Revit环境中深入洞察模型元素的属性和结构,从而更好地理解和优化BIM(建筑信息模型)项目。RevitLookup-2021.0.0.13...
编译的基于revit2017的lookup工具,帮助更好的开发revit插件。 RevitLookUp工具可以帮助我们调试Revit数据库,并能够辅助我们理解和查找元素以及它们的参数。但是网站上只有源码需要自己编译。