如何访问 weblogic 10.3.6 中定义的 JNDI 数据源

Posted

技术标签:

【中文标题】如何访问 weblogic 10.3.6 中定义的 JNDI 数据源【英文标题】:How to access JNDI data source defined in weblogic 10.3.6 【发布时间】:2013-04-19 13:53:09 【问题描述】:

我已经使用我的 weblogic 控制台创建了一个 JNDI 数据源,但我无法从我的 web 应用程序访问该对象。以下是详细内容

在 weblogic 10.3.6 中,我将数据源的 JNDI 名称指定为:jdbc/mydb

为了从我的 Web 应用程序获取数据库连接,我在我的 Web 应用程序中编写了以下代码:

Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/mydb");
jndiConnection = ds.getConnection();

之前我使用 Tomcat 作为服务器,当我在文件 tomcat/conf/server.xml 中配置资源详细信息时,我能够获得数据库连接,但是当我使用开始使用 weblogic 服务器时,出现以下错误:

Cannot establish DB connection to JNDI:java:/comp/env/jdbc/mydb While trying to look up /comp/env/jdbc/mydb in /app/webapp/sample.war/1811641702. caused by: javax.naming.NameNotFoundException: While trying to look up /comp/env/jdbc/mydb in /app/webapp/sample.war/1811641702.; remaining name '/comp/env/jdbc/mydb'

我已尝试此链接中提到的选项:How to lookup JNDI resources on WebLogic?,但我仍然面临问题。

请让我知道我在哪里做错了,访问JNDI对象的过程是什么。

【问题讨论】:

你的意思是把它命名为“jdbc/mydb”而不是“java/mydb”吗? @better_use_mkstemp 是的,我已经更新了我的问题,感谢您的指点。 您还尝试过问题链接中的第二种解决方案吗?第一个答案适用于 Tomcat,但我不确定它是否总是适用于 weblogic。删除 java:comp/env/ 并尝试 initContext.lookup("jdbc/mydb")? 是的,即使这不起作用,在这种情况下我也会遇到以下错误:无法建立与 JNDI 的数据库连接:jdbc/mydb 在尝试查找“jdbc.mydb”时没有找到子上下文“ jdbc'。解决了由以下原因引起的“”:javax.naming.NameNotFoundException:尝试查找“jdbc.mydb”时未找到子上下文“jdbc”。解决 '';剩余名称“jdbc/mydb” 答案也适用于 Weblogic 12.1.3 【参考方案1】:

参考帖子后:Tomcat vs Weblogic JNDI Lookup我已经修改了我的代码。

在我的 web 应用程序的 java 程序中使用以下代码解决了我的问题:

Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("jdbc/mydb");
jndiConnection = ds.getConnection();

此外,在 weblogic 控制台中,我已将我的 JNDI 对象添加到部署我的 Web 应用程序的管理服务器(在服务器选项下)。

【讨论】:

所以你完全按照我在评论中告诉你的去做了,它奏效了...... derp。来吧伙计! @better_use_mkstemp:认为您应该在答案中总结您的 cmets。 我有同样的问题,没有找到JNDI资源,虽然我之前创建了它。关键是将资源分配给特定的服务器。【参考方案2】:

在 weblogic 12c 中尝试了您的答案,但没有奏效..!

当我尝试仅使用 dataSource myDB 的名称(删除了 jdbc/)时,它工作正常。

Context initContext = new InitialContext();
DataSource ds = (DataSource)initContext.lookup("myDB");
jndiConnection = ds.getConnection();

【讨论】:

我自己创建的 JNDI 名称的值为“jdbc/mydb”,所以我无法删除它。【参考方案3】:

Weblogic 12c 的相同解决方案是

将以下依赖项添加到您的 pom.xml.. 创建一个具有当前中间件主页值 $oracleMiddlewareHome 的变量,然后...

<dependency>
        <groupId>weblogic</groupId>
        <artifactId>webservices</artifactId>
        <version>12.1.3</version>
        <scope>system</scope>
        <systemPath>
            $oracleMiddlewareHome/wlserver/server/lib/weblogic.jar
        </systemPath>
    </dependency>

现在使用下面的代码:

 Hashtable<String, String> h = new Hashtable<String, String>(7);
h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, "t3://localhost:7001");//add ur url
h.put(Context.SECURITY_PRINCIPAL, "weblogic");//add username
h.put(Context.SECURITY_CREDENTIALS, "welcome1");//add password

    Bundle bundle;
    try 
        InitialContext ctx = new InitialContext(h);
       DataSource dataSource = ((DataSource) ctx.lookup("jdbc/ContextBindingDS"));
        bundle = (Bundle) ctx.lookup(BUNDLE_JNDI_NAME);


     catch (NamingException e) 
        e.printStackTrace();
     catch (ClassNotFoundException e) 
        e.printStackTrace();
    catch (Exception e)
        e.printStackTrace();
    

【讨论】:

以上是关于如何访问 weblogic 10.3.6 中定义的 JNDI 数据源的主要内容,如果未能解决你的问题,请参考以下文章

centos7 下10.3.6weblogic安装需要注意啥

Weblogic< 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271)

weblogic10.3.5升级包在哪下载

Weblogic漏洞利用

WebLogic 10.3.6.0 升级反序列化漏洞补丁

关于weblogic 10.3.6.0 的漏洞复现