2017-01-30 4 views
1

У меня есть небольшое веб-приложение, построенное с Spring Boot, которое имеет два источника данных (один для данных приложения и один для получения информации о доступе пользователя). Я настроил это успешно, используя класс конфигурации для каждого источника данных и используя данные о соединении с источником данных в файле application.properties.Настройка двух источников данных с помощью jndi lookup with Springboot

Теперь я пытаюсь реорганизовать это, чтобы использовать поиск jndi для данных источника данных, чтобы я мог использовать тот же подход локально, что и в dev/test и prod.

Я изменил свои классы конфигурации базы данных, чтобы использовать поиск jndi, и теперь я запускаю свое приложение на Pivotal tc Server, представленном в Spring Tool Suite.

В настоящее время я вижу, что один из источников данных настроен правильно (я возвращаю счетчик записей из таблицы при запуске приложения). Однако мой второй источник данных не появляется, чтобы правильно настроен, и я получаю исключение ...

java.sql.SQLException: The url cannot be null 
    at java.sql.DriverManager.getConnection(DriverManager.java:556) ~[na:1.7.0_40] 
    at java.sql.DriverManager.getConnection(DriverManager.java:187) ~[na:1.7.0_40] 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:308) ~[tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) ~[tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:716) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:648) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:468) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) [tomcat-jdbc-8.5.4.jar:na] 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131) [tomcat-jdbc-8.5.4.jar:na] 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) [spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) [spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342) [spring-jdbc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.autoconfigure.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:139) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getDefaultDdlAuto(JpaProperties.java:224) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getOrDeduceDdlAuto(JpaProperties.java:212) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.getAdditionalProperties(JpaProperties.java:188) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate.access$000(JpaProperties.java:129) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.getHibernateProperties(JpaProperties.java:126) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.isInitializingDatabase(DataSourceInitializedPublisher.java:80) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.orm.jpa.DataSourceInitializedPublisher.postProcessAfterInitialization(DataSourceInitializedPublisher.java:68) [spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1723) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:113) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1600) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:634) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:448) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:207) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1214) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1054) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:189) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) [spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) [spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) [spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:150) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:130) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5156) [catalina.jar:na] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:na] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:na] 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:na] 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) [catalina.jar:na] 
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:586) [catalina.jar:8.0.26.B] 
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1750) [catalina.jar:8.0.26.B] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_40] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_40] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_40] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_40] 
    at java.lang.Thread.run(Thread.java:724) [na:1.7.0_40] 

Мой application.properties файл имеет следующие свойства

spring.datasource.jndi-name=java:comp/env/jdbc/app_datasource 
spring.datasource.expected-type=javax.sql.DataSource 

security.datasource.jndi-name=java:comp/env/jdbc/security_datasource 
security.datasource.expected-type=javax.sql.DataSource 

Мои классы конфигурации базы данных выглядят следующим образом. .

@Configuration 
@EnableConfigurationProperties 
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) 
public class AppDBConfig { 

    @Bean 
    @ConfigurationProperties(prefix = "spring.datasource") 
    public JndiPropertyHolder primary() { 
     return new JndiPropertyHolder(); 
    } 

    @Bean(name = "app") 
    @Primary 
    public DataSource appDataSource() { 
     JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); 
     DataSource dataSource = dataSourceLookup.getDataSource(primary().getJndiName()); 
     return dataSource; 
    } 
} 

@Configuration 
@EnableConfigurationProperties 
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class}) 
public class SecurityDBConfig { 

    @Bean 
    @ConfigurationProperties(prefix = "security.datasource") 
    public JndiPropertyHolder security() { 
     return new JndiPropertyHolder(); 
    } 

    @Bean(name = "security") 
    public DataSource securityDataSource() { 
     JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup(); 
     DataSource dataSource = dataSourceLookup.getDataSource(security().getJndiName()); 
     return dataSource; 
    } 
} 

и server.xml выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?> 
<Server port="${base.shutdown.port}" shutdown="SHUTDOWN"> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> 
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> 
    <Listener className="com.springsource.tcserver.serviceability.deploy.TcContainerDeployer"/> 
    <Listener accessFile="${catalina.base}/conf/jmxremote.access" address="127.0.0.1" authenticate="true" className="com.springsource.tcserver.serviceability.rmi.JmxSocketListener" passwordFile="${catalina.base}/conf/jmxremote.password" port="${base.jmx.port}" useSSL="false"/> 
    <GlobalNamingResources> 
     <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/> 
    </GlobalNamingResources> 
    <Service name="Catalina"> 
     <Executor maxThreads="300" minSpareThreads="50" name="tomcatThreadPool" namePrefix="tomcat-http--"/> 
     <Engine defaultHost="localhost" name="Catalina"> 
      <Realm className="org.apache.catalina.realm.LockOutRealm"> 
       <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 
      </Realm> 
      <Host appBase="webapps" autoDeploy="true" deployOnStartup="true" deployXML="true" name="localhost" unpackWARs="true"> 
       <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/> 
       <Context docBase="bsc" path="/bsc" reloadable="true" source="org.eclipse.jst.jee.server:bsc"> 
        <Resource auth="Container" defaultAutoCommit="true" driverClassName="com.sybase.jdbc3.jdbc.SybDriver" maxActive="20" maxIdle="30000" maxWait="100" name="jdbc/security_datasource" password="securityPassword" removeAbandoned="true" removeAbandonedTimeout="15" type="javax.sql.DataSource" url="jdbc:sybase:Tds:server.systems.uk.co:10010/security_database" username="securityUserName"/> 
        <Resource auth="Container" defaultAutoCommit="true" driverClassName="net.sourceforge.jtds.jdbc.Driver" maxActive="20" maxIdle="30000" maxWait="100" name="jdbc/app_datasource" password="appPassword" removeAbandoned="true" removeAbandonedTimeout="15" type="javax.sql.DataSource" url="jdbc:jtds:sybase://server.systems.uk.co:10010/app_database" username="appUserName"/> 
       </Context> 
      </Host> 
     </Engine> 
     <Connector maxHttpHeaderSize="1508192" acceptCount="100" connectionTimeout="20000" executor="tomcatThreadPool" maxKeepAliveRequests="15" port="${bio.http.port}" protocol="org.apache.coyote.http11.Http11Protocol" redirectPort="${bio.https.port}"/> 
    </Service> 
</Server> 

Может ли кто-нибудь понять, почему мой второй источник данных не настроен? Это проблема сроков жизненного цикла ?. Как я говорю, основной источник данных конфигурирует правильно, но безопасность терпит неудачу

Update

JndiPropertyHolder просто простой класс удобства, как показано ниже

import org.springframework.stereotype.Component; 

@Component 
public class JndiPropertyHolder { 
    private String jndiName; 

    public String getJndiName() { 
     return this.jndiName; 
    } 

    public void setJndiName(final String jndiName) { 
     this.jndiName = jndiName; 
    } 

} 
+0

пожалуйста, вы можете упомянуть thereference о Класс 'JndiPropertyHolder'? Я не могу найти импорт для его разрешения. –

+0

см. Обновление выше Saurabh – Craig

+0

см. Мой ответ ниже; раскомментируйте всю прокомментированную часть, чтобы она выполнялась в соответствии с ожиданиями –

ответ

1

Я достиг этого успешно настроив свою пружину как указано ниже:

//1. Application.java 
//package hello; 
// 
//import javax.sql.DataSource; 
// 
//import org.apache.commons.logging.Log; 
//import org.apache.commons.logging.LogFactory; 
//import org.springframework.beans.factory.annotation.Value; 
//import org.springframework.boot.SpringApplication; 
//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
//import org.springframework.boot.builder.SpringApplicationBuilder; 
//import org.springframework.boot.web.support.SpringBootServletInitializer; 
//import org.springframework.context.annotation.Bean; 
//import org.springframework.context.annotation.ComponentScan; 
//import org.springframework.context.annotation.Configuration; 
//import org.springframework.context.annotation.Primary; 
//import org.springframework.jdbc.core.JdbcTemplate; 
//import org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup; 
// 
//import hello.utilspackage.Foo; 
//import springfox.documentation.builders.PathSelectors; 
//import springfox.documentation.builders.RequestHandlerSelectors; 
//import springfox.documentation.spi.DocumentationType; 
//import springfox.documentation.spring.web.plugins.Docket; 
//import springfox.documentation.swagger2.annotations.EnableSwagger2; 
// 
//@Configuration 
//@ComponentScan 
//@EnableAutoConfiguration 
public class Application extends SpringBootServletInitializer { 

    private final Log logg = LogFactory.getLog(getClass()); 

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

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     logg.info("Server startup data loading started"); 
     new Foo().bar(); 
     logg.info("Server startup data loading completed"); 
     return application.sources(applicationClass); 
    } 

    @Configuration 
    public class Config { 
     @Value("${foo.spring.datasource.jndi-name}") 
     private String primaryJndiName; 

     @Value("${bar.spring.datasource.jndi-name}") 
     private String secondaryJndiName; 

     @Primary 
     @Bean(destroyMethod = "") 

     public DataSource primaryDs() { 
      JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
      return lookup.getDataSource(primaryJndiName); 
     } 

     @Bean(destroyMethod = "") 

     public DataSource secondaryDs() { 
      JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
      return lookup.getDataSource(secondaryJndiName); 
     } 
    } 

    @Configuration 
    public class ConfigJdbcTemplates { 
     @Value("${foo.spring.datasource.jndi-name}") 
     private String primaryJndiName; 

     @Value("${bar.spring.datasource.jndi-name}") 
     private String secondaryJndiName; 

     @Primary 
     @Bean(destroyMethod = "") 

     public JdbcTemplate primaryJT() { 
      JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
      return new JdbcTemplate(lookup.getDataSource(primaryJndiName)); 
     } 

     @Bean(destroyMethod = "") 

     public JdbcTemplate secondaryJT() { 
      JndiDataSourceLookup lookup = new JndiDataSourceLookup(); 
      return new JdbcTemplate(lookup.getDataSource(secondaryJndiName)); 
     } 
    } 

    @Configuration 
    @EnableSwagger2 
    public class SwaggerConfig { 
     @Bean 
     public Docket api() { 
      return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()) 
        .paths(PathSelectors.any()).build(); 
     } 
    } 

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

} 

Обратите внимание на класс Config в фрагменте кода выше, он был с аннотацией @Configuration и один из источников данных в нем объявлен @Primary

//GreetingController.java 
//package hello; 
// 
//import java.util.List; 
//import java.util.Map; 
//import java.util.Set; 
//import java.util.concurrent.atomic.AtomicLong; 
// 
//import org.springframework.beans.factory.annotation.Autowired; 
//import org.springframework.jdbc.core.JdbcTemplate; 
//import org.springframework.web.bind.annotation.RequestMapping; 
//import org.springframework.web.bind.annotation.RequestParam; 
//import org.springframework.web.bind.annotation.RestController; 
// 
//import hello.Application.Config; 
// 
//@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @Autowired 
    Config conf; 

    @RequestMapping("/greeting") 
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) { 
     String ss = null; 
     List<Map<String, Object>> a = new JdbcTemplate(conf.secondaryDs()) 
       .queryForList("SELECT * from secondaryDB"); 
     for (Map<String, Object> map : a) { 
      Set<String> kkeys = map.keySet(); 
      for (String string : kkeys) { 
       if (map.get(string) != null) 
        ss += string + " -- " + map.get(string).toString() + "## "; 
      } 
     } 
     return new Greeting(counter.incrementAndGet(), String.format(template, ss)); 
    } 

    @RequestMapping("/") 
    public Greeting greetingBlank() throws Exception { 
     String ss = null; 
     List<Map<String, Object>> a = new JdbcTemplate(conf.primaryDs()).queryForList(
       "SELECT * from primaryDB"); 
     for (Map<String, Object> map : a) { 
      Set<String> kkeys = map.keySet(); 
      for (String string : kkeys) { 
       if (map.get(string) != null) 
        ss += string + " -- " + map.get(string).toString() + "## "; 
      } 
     } 
     return new Greeting(counter.incrementAndGet(), String.format(template, ss)); 
    } 
} 

В настоящее время в одном из моих контроллеров отдыха, то есть в Класс GreetingController я могу безопасно использовать экземпляр конфигурации @Autowired Config. Так что мы можем использовать new JdbcTemplate(conf.secondaryDs()) для запроса базы данных, относящейся к вторичному источнику данных. ИЛИ new JdbcTemplate(conf.primaryDs()) для запросов к базе данных, переданные на первичном источнике данных

** То же может быть достигнуто путем настройки JdbcTemplates в Application.class, для этого наблюдения классу ConfigJdbcTemplates в Application.java.Пожалуйста, посмотрите на ниже реализации в контроллере DatabasePrimaryQueryController

//DatabasePrimaryQueryController.java 
//package hello; 
// 
//import java.util.List; 
//import java.util.Map; 
//import java.util.Set; 
//import java.util.concurrent.atomic.AtomicLong; 
// 
//import org.springframework.beans.factory.annotation.Autowired; 
//import org.springframework.web.bind.annotation.RequestMapping; 
//import org.springframework.web.bind.annotation.RestController; 
// 
//import hello.Application.ConfigJdbcTemplates; 
// 
//@RestController 
public class DatabasePrimaryQueryController { 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @Autowired 
    ConfigJdbcTemplates confJts; 

    @RequestMapping("/queryforpas") 
    public Greeting greeting() throws Exception { 
     String ss = null; 
     List<Map<String, Object>> a = confJts.secondaryJT() 
       .queryForList("SELECT * from secondaryDB"); 
     for (Map<String, Object> map : a) { 
      Set<String> kkeys = map.keySet(); 
      for (String string : kkeys) { 
       if (map.get(string) != null) 
        ss += string + " -- " + map.get(string).toString() + "## "; 
      } 
     } 
     return new Greeting(counter.incrementAndGet(), String.format(template, ss)); 
    } 

    @RequestMapping("/queryforods") 
    public Greeting greetingBlank() throws Exception { 
     String ss = null; 
     List<Map<String, Object>> a = confJts.primaryJT().queryForList(
       "SELECT * from primaryDB"); 
     for (Map<String, Object> map : a) { 
      Set<String> kkeys = map.keySet(); 
      for (String string : kkeys) { 
       if (map.get(string) != null) 
        ss += string + " -- " + map.get(string).toString() + "## "; 
      } 
     } 
     return new Greeting(counter.incrementAndGet(), String.format(template, ss)); 
    } 
} 

Оба указанных выше методов работают в соответствии с ожиданиями той лишь разницей, что в первом варианте осуществления, я и автоматического связывания источников данных в реализации второго JdbcTemplate Автообновлено.

Мой application.properties файл, как показано ниже

server.servlet-path=/* 
server.port=7877 
foo.spring.datasource.jndi-name=java:/PrimaryDB 
bar.spring.datasource.jndi-name=java:/SecondaryDB 

Это приложение развернуто на JBoss еар 6.4, где JNDI-имена связаны с деталями DataSource из JBoss' standalone.xml

Смежные вопросы