我在这里问了一个问题,但不完整,被标记为重复的here
因此,基于已经提出的问题-@ surasin-tancharoen的一个特定答案似乎就是我所需要的。
但是尝试这样做也给了我NullPointerException
,因为从未创建/注入数据源。
以下是详细信息:
在下面的代码中,我定义了2个bean。我已经定义了两个带有@Qualifier
批注的数据源和@ConfigurationProperties
来从属性文件中读取JNDI名称。
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@Qualifier("ds1")
@ConfigurationProperties(prefix="spring.datasource1")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@Qualifier("ds2")
@ConfigurationProperties(prefix="spring.datasource2")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
在application.properties
中:
spring.datasource1.jndi-name=AbcDS
spring.datasource2.jndi-name=XyzDS
然后在我的DAO中-我正在尝试使用此数据源:
@Autowired
@Qualifier("ds1")
DataSource dataSource;
但是,由于我在此代码行得到了NullPointerException
,所以未注入数据源:
conn = dataSource.getConnection();
通过将Spring Boot应用程序部署到Weblogic 12c来尝试所有这些操作
答案 0 :(得分:1)
该解决方案与“ DataSourceBuilder”的不正确使用有关,不应将其用于JNDI数据源。
这是我的工作方式: (在weblogic上部署spring boot war并使用weblogic中定义的数据源)
首先,我们指定在weblogic中定义的数据源-在这里,我们指定在weblogic中定义的数据源的JNDI名称:
spring.datasource.xyz.jndi-name=XYZDS
spring.datasource.test.jndi-name=TESTDS
这是使用上面定义的属性创建并公开数据源的位置: 我们将 application.properties 中的属性注入到字符串变量中,以存储数据源的JNDI名称。
@Configuration
public class DataSourceConfig {
@Value( "${spring.datasource.xyz.jndi-name}" )
private String xyzJndiName;
@Value( "${spring.datasource.test.jndi-name}" )
private String testJndiName;
@Bean(name = "XyzDataSource")
public DataSource getXyzDataSource() throws Exception {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource(xyzJndiName);
}
@Bean(name = "TestDataSource")
public DataSource getTestDataSource() throws Exception {
JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
return dataSourceLookup.getDataSource(testJndiName);
}
需要注意的几个关键点: 我们不应该不对JNDI数据源使用“ DataSourceBuilder”,否则它将不起作用。
这就是为什么我的情况不起作用。
现在,我使用的是' JndiDataSourceLookup ',可以解决问题。
要注意的另一件事是,我们需要使用具有属性“名称”的标准@Bean注释。
这对于使用此数据源的代码很重要。 因此,现在数据源已成功创建并公开。
确定要消耗的时间:
@Repository
public class SomeDaoImpl {
@Autowired
@Qualifier("XyzDataSource")
DataSource dataSource;
@Override
public List <String> create(Employee request) {
Connection conn = null;
conn = dataSource.getConnection();
在这里,我们使用 @Qualifier 注释来提取适当的数据源。 就是这样-现在可以使用。 我在其他数据源上进行了尝试-效果很好。
注意: 我不想接受我自己的答案-所以如果有其他人有更好和更优雅的解决方案,我将等待几天,请回答-我们很乐意接受您的回答,而不是回答我自己的问题并接受! >