我试图将我的小应用程序从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");
}
这看起来基本上是正确的,除了查找与server.xml中配置的jndiName匹配,
@Resource(lookup = "jdbc/test", name="java:comp/env/jdbc/test")
private DataSource dataSource;
我注意到的第一件事是你有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。
要获得这个验证特性的完整演示,请参阅本文。