WebSphere Liberty + Springboot + Hibernate + JNDI

mki*_*uac 3 spring jndi websphere-liberty spring-boot open-liberty

我正在尝试将小型应用程序从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>
Run Code Online (Sandbox Code Playgroud)

 <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>
Run Code Online (Sandbox Code Playgroud)

数据配置类

@Configuration
public class DataSourceConfig {

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

我也尝试过这种方法:

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

And*_*ert 5

我注意到的第一件事是<jdbcDriver>server.xml中有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>
Run Code Online (Sandbox Code Playgroud)

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

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

这实际上表示“对'java:comp / env / jdbc / test'执行JNDI查找并将其绑定到'java:comp / env / jdbc / test'JNDI名称”。这将导致无限循环或循环引用。

相反,您想像这样将绑定lookupjndiName您在server.xml中定义的:

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

或者,如果这样不起作用,您可以尝试像下面这样在Spring中进行直接查找:

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

或使用Java标准API:

DataSource ds = javax.naming.InitialContext.doLookup("jdbc/test");
Run Code Online (Sandbox Code Playgroud)

如果这些选项都不起作用,请检查服务器日志中是否有错误或警告。应该说明为什么无法创建数据源。


Liberty 19.0.0.9中的新功能-数据源验证API

在19.0.0.9中,我们发布了REST API,可用于验证dataSources之类的配置元素。

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

<quickStartSecurity userName="adminuser" userPassword="adminpwd"/>
Run Code Online (Sandbox Code Playgroud)

然后,在Web浏览器中https://localhost:9443/ibm/api/validation/dataSource/{DATASOURCE_ID},根据您的情况转到https:// localhost:9443 / ibm / api / validation / dataSource / test

要获得此验证功能的完整演练,请参阅此文章

  • 谢谢。这非常有帮助。我已移至10.0.0.9,并使用该实用程序来确认我的JNDI是否正常工作。我仍然遇到数据问题(可能是Spring的CrudRepository / JPA),但是您的回答帮助我前进并确认了那部分。我想我将提出另一个问题,以使StackOverflow上的内容清晰明了,并避免其他人感到困惑 (2认同)