我正在尝试将我的小应用程序从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,可用于验证配置元素,例如dataSource
s。
要将其与您的配置一起使用,请像这样配置管理员用户(如果尚未配置
(:<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;