Java 使用@Resource和JNDI查找时出现问题

Java 使用@Resource和JNDI查找时出现问题,java,weblogic,jndi,Java,Weblogic,Jndi,我在使用EJB应用注入和JNDI的概念时遇到了困难,我希望您能提供帮助。我正在学习这一点,我真的很想了解并应用@Resource和/或JNDI查找XML配置的技术。我在JNDI查找中似乎找不到任何初始参数。现在,在继续之前,如果手动输入数据源的JNDI名称,一切都会很好。我试图做的(同样作为练习)是使用@Resource或JNDI获取JNDI数据源名称本身,然后在数据源上执行JNDI查找。我知道你可以直接注入一个数据源对象,但是如果我不能注入一个字符串,我必须从这个开始 首先,这里是我的ejb-

我在使用EJB应用注入和JNDI的概念时遇到了困难,我希望您能提供帮助。我正在学习这一点,我真的很想了解并应用@Resource和/或JNDI查找XML配置的技术。我在JNDI查找中似乎找不到任何初始参数。现在,在继续之前,如果手动输入数据源的JNDI名称,一切都会很好。我试图做的(同样作为练习)是使用@Resource或JNDI获取JNDI数据源名称本身,然后在数据源上执行JNDI查找。我知道你可以直接注入一个数据源对象,但是如果我不能注入一个字符串,我必须从这个开始

首先,这里是我的ejb-jar.xml的重要部分:

<env-entry>
    <description>DataSource JNDI lookup name</description>
    <env-entry-name>datasourceName</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>myDataSource</env-entry-value>
</env-entry>
我还尝试了mappedName和lookup(使用JNDI查找),但没有任何结果。然后我尝试了JNDI查找,如下所示:

 // get JNDI name from environment entry in EJB Context and use to lookup DataSource
Context context = new InitialContext();
String dsName = (String) context.lookup("java:comp/env/SRS/datasourceName");
(应用程序的名称是SRS)-这带来了一个NamingException,JNDI查找没有找到任何内容。我尝试了以下查找:

String datasourceName = (String) context.lookup("java:comp/env/SRS/Status/datasourceName"); // name of EJB is Status
String datasourceName = (String) context.lookup("datasourceName");
String datasourceName = (String) context.lookup("SRS/datasourceName");           
String datasourceName = (String) context.lookup("SRS/Status/datasourceName");           
String datasourceName = (String) context.lookup("java:global/SRS/datasourceName");
String datasourceName = (String) context.lookup("java:global/SRS/Status/datasourceName");

我的第一篇文章在这里,所以我希望我问得正确。谢谢你的帮助

好的。两天后,我发现我的错误不在EJB本身的代码中,而在调用EJB的JSP配置中!!我的错误是,我以某种方式将EJB类的方法作为POJO调用,而不是通过容器调用。自从调用EJB方法以来,我一直假设容器已经正确地将EJB注入JSP。但事实并非如此。我在JSP中进行了JNDI查找,所有问题都自行解决了。谢谢大家的回复

好的。两天后,我发现我的错误不在EJB本身的代码中,而在调用EJB的JSP配置中!!我的错误是,我以某种方式将EJB类的方法作为POJO调用,而不是通过容器调用。自从调用EJB方法以来,我一直假设容器已经正确地将EJB注入JSP。但事实并非如此。我在JSP中进行了JNDI查找,所有问题都自行解决了。谢谢大家的回复

检查这里:如果它真的只是
datasourceName
它看起来像
context.lookup(“datasourceName”)应该正在工作。您可以检查的另一件事是在管理控制台中,转到
服务器摘要->您的服务器名称->查看JNDI树
,并确保您的数据源名称已显示。@better\u use\u mkstemp-感谢您的响应。数据源运行良好。也就是说,如果我尝试使用以下代码直接对数据源进行JNDI查找
datasource ds=(datasource)context.lookup(“myDataSource”)我可以访问数据源。我在这里尝试的是使用XML配置直接向EJB提供字符串。我希望澄清一下。如果使用了
@Resource(name=“datasourceName”)
,那么
java:comp/env/datasourceName
是正确的查找字符串。也就是说,当注释和XML中指定了相同的名称时,我不知道为什么注入不起作用;这应该是可行的。检查这里:如果它真的只是
datasourceName
它看起来像
context.lookup(“datasourceName”)应该正在工作。您可以检查的另一件事是在管理控制台中,转到
服务器摘要->您的服务器名称->查看JNDI树
,并确保您的数据源名称已显示。@better\u use\u mkstemp-感谢您的响应。数据源运行良好。也就是说,如果我尝试使用以下代码直接对数据源进行JNDI查找
datasource ds=(datasource)context.lookup(“myDataSource”)我可以访问数据源。我在这里尝试的是使用XML配置直接向EJB提供字符串。我希望澄清一下。如果使用了
@Resource(name=“datasourceName”)
,那么
java:comp/env/datasourceName
是正确的查找字符串。也就是说,当注释和XML中指定了相同的名称时,我不知道为什么注入不起作用;这应该行得通。
String datasourceName = (String) context.lookup("java:comp/env/SRS/Status/datasourceName"); // name of EJB is Status
String datasourceName = (String) context.lookup("datasourceName");
String datasourceName = (String) context.lookup("SRS/datasourceName");           
String datasourceName = (String) context.lookup("SRS/Status/datasourceName");           
String datasourceName = (String) context.lookup("java:global/SRS/datasourceName");
String datasourceName = (String) context.lookup("java:global/SRS/Status/datasourceName");