WebSphere Liberty + Springboot + Hibernate + JNDI



我正在尝试将我的小应用程序从Tomcat迁移到WebSphere。为此,我从头开始重建它,分别解决主要组件。我正在努力解决webSphere Liberty上的数据访问/JNDI。我得到

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

服务器

.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 个<jdbcDriver>元素.xml -- 只应该使用一个,如下所示:

<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名称"。这将导致无限循环或循环引用。

相反,您希望将lookup绑定到在服务器中定义的jndiName.xml如下所示:

@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 标准 API:

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

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


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

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

要将其与您的配置一起使用,请像这样配置管理员用户(如果尚未配置

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

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

若要获取此验证功能的完整演练,请参阅此帖子。

这看起来大多是正确的,除了查找与在 server.xml 中配置的 jndiName 匹配,

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

最新更新