当前位置: 首页 > 知识库问答 >
问题:

WebSphere Liberty Springboot Hibernate JNDI

闻人栋
2023-03-14

我试图将我的小应用程序从Tomcat迁移到WebSphere。为了做到这一点,我从头开始重新构建它,分别处理主要组件。我正在纠结webSphere Liberty上的数据访问/ JNDI。我明白了

javax.naming.NameNotFoundException:javax.naming.NameNotFoundException: java: comp/env/jdbc/test

SERVER.xml

<featureManager>
<feature>webProfile-8.0</feature>
<feature>localConnector-1.0</feature>
<feature>adminCenter-1.0</feature>
<feature>javaee-8.0</feature>
<feature>jndi-1.0</feature>
<feature>concurrent-1.0</feature>
 <dataSource id="test" jndiName="jdbc/test" type="javax.sql.DataSource">
    <jdbcDriver libraryRef="MySQLLib" />
    <properties databaseName="test" serverName="localhost" portNumber="3306" user="user" password="mypassword" />
    <jdbcDriver>
      <library id="MySQLLib">
        <fileset dir="/Library/JDBC/" includes="mysql-connector-java-5.1.14-bin.jar" />
      </library>
    </jdbcDriver>
  </dataSource>

数据配置类

@Configuration
public class DataSourceConfig {

@Resource(lookup = "java:comp/env/jdbc/test", name="java:comp/env/jdbc/test")
private DataSource dataSource;

我也尝试过这种方法:

@Bean
public DataSource dataSource() throws NamingException {
    return (DataSource) new JndiTemplate().lookup("java:comp/env/jdbc/test");
}

共有2个答案

海翼
2023-03-14

这看起来基本上是正确的,除了查找与server.xml中配置的jndiName匹配,

@Resource(lookup = "jdbc/test", name="java:comp/env/jdbc/test")
private DataSource dataSource;
贺宏逸
2023-03-14

我注意到的第一件事是你有2个

 <dataSource id="test" jndiName="jdbc/test" type="javax.sql.DataSource">
    <properties databaseName="test" serverName="localhost" portNumber="3306" user="user" password="mypassword" />
    <jdbcDriver>
      <library id="MySQLLib">
        <fileset dir="/Library/JDBC/" includes="mysql-connector-java-5.1.14-bin.jar" />
      </library>
    </jdbcDriver>
  </dataSource>

接下来,您将定义一个资源引用,如下所示:

@Resource(lookup = "java:comp/env/jdbc/test", name="java:comp/env/jdbc/test")
private DataSource dataSource;

这实际上是说“执行‘Java:comp/env/JDBC/test’的JNDI查找,并将其绑定到‘Java:comp/env/JDBC/test’JNDI名称”。这将导致无限循环或循环引用。

相反,您希望将查找绑定到您在server.xml中定义的jndiName,如下所示:

@Resource(lookup = "jdbc/test", name="java:comp/env/jdbc/test")
private DataSource dataSource;

或者,如果这不起作用,您可以尝试使用Spring方式直接查找,如下所示:

@Bean
public DataSource dataSource() throws NamingException {
    return (DataSource) new JndiTemplate().lookup("java:comp/env/jdbc/test");
}

或使用 Java 标准接口:

DataSource ds = javax.naming.InitialContext.doLookup("jdbc/test");

如果这些选项都不起作用,请检查服务器日志中的错误或警告。应该有一些关于为什么数据源不能被创建的指示。

19.0.0.9我们发布了一个REST API,可用于验证配置元素,例如dataSource

要将其与配置一起使用,请按如下方式配置管理员用户(如果尚未配置):

<quickStartSecurity userName="adminuser" userPassword="adminpwd"/>

然后在Web浏览器中转到 https://localhost:9443/ibm/api/validation/dataSource/{DATASOURCE_ID},这在你的情况下 https://localhost:9443/ibm/api/validation/dataSource/test。

要获得这个验证特性的完整演示,请参阅本文。

 类似资料:

相关问答

相关文章

相关阅读