WebSphere Liberty + Springboot + Hibernate + JNDI - PullRequest
3 голосов
/ 23 сентября 2019

Я пытаюсь перенести мое небольшое приложение из Tomcat в WebSphere.Для этого я перестраиваю его с нуля, обращаясь к основным компонентам отдельно.Я борюсь с доступом к данным / JNDI в WebSphere Liberty.Я получаю

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 ]

5 голосов
/ 23 сентября 2019

Первое, что я заметил, это то, что у вас есть 2 <jdbcDriver> элемента в вашем server.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;

Это фактически говорит: "выполнить поиск JNDI для java: comp / env / jdbc / test" и связать его с именем JNDI "java: comp / env / jdbc / test"».Это приведет к бесконечному циклу или циклической ссылке.

Вместо этого вы хотите связать lookup с jndiName, который вы определили в вашем server.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");
}

или с помощью стандартного API Java:

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.

Чтобы получить полное описание этой функции проверки, см. это сообщение .

1 голос
/ 23 сентября 2019

В основном это выглядит правильно, за исключением того, что поиск совпадает с jndiName, настроенным в server.xml,

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