it-roy-ru.com

Сбой при поиске источника данных JNDI при весенней загрузке - имя comp/env/jdbc не найдено в контексте "Java:"

Я установил приложение весенней загрузки (v 1.1.9) для развертывания в виде файла WAR. И я пытаюсь интегрировать это веб-приложение с существующим модулем обслуживания данных (добавлен как зависимость maven).

Среда пытается развернуть: WebSphere Application Server 8.5.5.4

Проблема, с которой я сталкиваюсь, - это ошибка запуска приложения, когда я пытаюсь найти источник данных JNDI (jdbc/fileUploadDS), как показано ниже, в зависимом модуле обслуживания данных.

@Configuration
@Profile("prod")
public class JndiDataConfig implements DataConfig {

    @Bean
    public DataSource dataSource() throws NamingException {
          Context ctx = new InitialContext();
          return (DataSource) ctx.lookup("Java:comp/env/jdbc/fileUploadDS");
    }

}

Моя конфигурация Spring Boot:

@Configuration
@ComponentScan(basePackages = { "au.com.aiaa.fileupload.data.*", "demo" })
@EnableAutoConfiguration(exclude = { HibernateJpaAutoConfiguration.class, DataSourceAutoConfiguration.class })
public class SampleApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(applicationClass, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }

    private static Class<SampleApplication> applicationClass = SampleApplication.class;

    @Bean
    public static Properties fileUploadJndiProperties() throws NamingException {
        JndiObjectFactoryBean jndiFactoryBean = new JndiObjectFactoryBean();
        jndiFactoryBean.setJndiName("props/FileUploadProperties");
        jndiFactoryBean.setExpectedType(Properties.class);
        jndiFactoryBean.setLookupOnStartup(true);
        jndiFactoryBean.afterPropertiesSet();
        return (Properties) jndiFactoryBean.getObject();
    }

}

Обратите внимание, что я могу успешно искать реквизиты/FileUploadProperties. Но неспособность сделать то же самое для источника данных.

Я сомневаюсь, что он пытается загрузить EmbeddedWebApplicationContext, а это не то, что мне нужно.

Трассировка стека:

Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource() throws javax.naming.NamingException] threw exception; nested exception is **javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "Java:".**
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.Java:301)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.Java:1186)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:537)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.Java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.Java:302)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.Java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.Java:298)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.Java:193)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.Java:706)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.Java:762)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:482)
        at **org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:109)**
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:691)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:320)
        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.Java:142)
        at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.Java:89)
        at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.Java:51)
        at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.Java:175)


..................

Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public javax.sql.DataSource au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource() throws javax.naming.NamingException] threw exception; nested exception is **javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "Java:".**
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:188)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.Java:586)
        ... 132 common frames omitted
Caused by: javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "Java:".
        at com.ibm.ws.naming.ipbase.NameSpace.getParentCtxInternal(NameSpace.Java:1970)
        at com.ibm.ws.naming.ipbase.NameSpace.retrieveBinding(NameSpace.Java:1377)
        at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.Java:1220)
        at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.Java:1142)
        at com.ibm.ws.naming.urlbase.UrlContextImpl.lookupExt(UrlContextImpl.Java:1436)
        at com.ibm.ws.naming.Java.javaURLContextImpl.lookupExt(javaURLContextImpl.Java:477)
        at com.ibm.ws.naming.Java.javaURLContextRoot.lookupExt(javaURLContextRoot.Java:485)
        at com.ibm.ws.naming.Java.javaURLContextRoot.lookup(javaURLContextRoot.Java:370)
        at org.Apache.aries.jndi.DelegateContext.lookup(DelegateContext.Java:161)
        at javax.naming.InitialContext.lookup(InitialContext.Java:436)
        at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig.dataSource(JndiDataConfig.Java:41)
        at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe.CGLIB$dataSource$0(<generated>)
        at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe$$FastClassBySpringCGLIB$$3c9e0518.invoke(<generated>)
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.Java:228)
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.Java:312)
        at au.com.aiaa.fileupload.data.dao.configuration.JndiDataConfig$$EnhancerBySpringCGLIB$$8001dbbe.dataSource(<generated>)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:60)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:37)
        at Java.lang.reflect.Method.invoke(Method.Java:611)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.Java:166)

Что мне здесь не хватает? Даже когда я пытаюсь явно определить метод bean-компонента dataSource в SampleApplication.Java, как показано ниже, он завершается с той же ошибкой.

@Bean
    public static DataSource dataSource() throws NamingException {
        JndiObjectFactoryBean jndiFactoryBean = new JndiObjectFactoryBean();
        jndiFactoryBean.setJndiName("Java:comp/env/jdbc/fileUploadDS");
        jndiFactoryBean.setExpectedType(DataSource.class);
        jndiFactoryBean.setLookupOnStartup(true);
        jndiFactoryBean.setResourceRef(true);
        jndiFactoryBean.afterPropertiesSet();
        return (DataSource) jndiFactoryBean.getObject();
    }

Я упомянул это и он говорит, что мы должны установить enableNaming () для контейнера сервлета? Могу ли я сделать что-то подобное для не встроенного контекста веб-приложения? Или это чисто проблема WAS 8.5?

6
Dinusha Kariyawasam

У вас должна быть ссылка на ресурс с именем jdbc/fileUploadDS в вашем web.xml. И убедитесь, что он связан с реальным именем источника данных во время установки или с помощью файла ibm-web-bnd.xml

Определение в web.xml:

<resource-ref>
    <description />
    <res-ref-name>jdbc/fileUploadDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

Если вы не хотите использовать web.xml, то в обычном приложении Java EE вы можете просто добавить в веб-компонент (сервлет, фильтр) следующую аннотацию класса:

@Resource(name="jdbc/fileUploadDS", type=javax.sql.DataSource.class, lookup="jdbc/fileUploadDS")

но я не специалист по Spring-boot, так что не знаю, будет ли это работать или возможно там.

8
Gas

Я сталкиваюсь с той же проблемой. Я не знаю, как определить тег в весенней загрузке, так как в весенней загрузке нет файла web.xml. 

Пока что я узнал, что мы должны определить это в файле приложения, откуда мы запускаем наше весеннее приложение. Я думаю, что нам нужно использовать этот метод для установки источника данных:

  @Bean(destroyMethod="")
  @ConfigurationProperties(prefix="datasource.mine")
  public DataSource dataSource() throws Exception {
      JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
      return dataSourceLookup.getDataSource("Java:jdbc/configurationFile");
  }
1
mohitkira

Я только что настроил весеннюю загрузку с помощью своего собственного источника данных следующим образом:

@Bean
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

и внутри файла application.properties я определил все настройки источника данных как обычно

spring.datasource.driver-class-name= ***
spring.datasource.url= ***
spring.datasource.username= ***
spring.datasource.password= ***
spring.datasource.jndi-name=jdbc/myDB

Это не работает хорошо с @SpringBootApplication со всеми другими настройками по умолчанию

Спасибо

0
Hany Sakr

Я могу подключить свое приложение Spring-Boot (развернутое в Websphere Application Server 9) к источнику данных WAS .... У меня сработал следующий код для подключения к DataSource:

@Bean(name = "WASDataSource")
public DataSource WASDataSource() throws Exception {        
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource("DSNAME");
}   

@Bean(name = "WASDataSourceJdbcTemplate")
public JdbcTemplate jdbcTemplate_WASDS(@Qualifier("WASDataSource")
DataSource dsDB2) {
return new JdbcTemplate(dsDB2);
}

Примечание. Имя источника данных «DSNAME» - это имя, которое отображается в пользовательском интерфейсе консоли Websphere. Это можно увидеть с помощью -> Выбрать ресурсы> JDBC> Источники данных. 

Затем я создал шаблон JDBC:

@Autowired
@Qualifier("WASDataSourceJdbcTemplate")
private JdbcTemplate db2WASTemplate;`

И выполнение запроса с использованием метода запроса работает нормально:
db2WASTemplate.query ()

Я не создавал файлы Web.xml или ibm-web-bnd.xml

0
yash nigam