java - Spring Boot Weblogic 12c JNDI DataSources:注入不起作用给出 NullPointerException
问题描述
我在这里问过一个问题,但不完整,在这里被标记为重复
因此,基于已经提出的问题——@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 来尝试的
解决方案
该解决方案与不应该用于 JNDI 数据源的“DataSourceBuilder”的错误使用有关。
这是我如何让它工作的:(在 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);
}
需要注意的几个关键点:我们不应该将“DataSourceBuilder”用于 JNDI 数据源——它不会起作用。
这就是为什么它在我的情况下不起作用的原因。
现在我正在使用' JndiDataSourceLookup '来解决问题。
另一件需要注意的事情是,我们需要使用带有属性“name”的标准@Bean 注解。
这在使用此数据源的代码中很重要。所以现在数据源已成功创建并公开。
OK 消费时间:
@Repository
public class SomeDaoImpl {
@Autowired
@Qualifier("XyzDataSource")
DataSource dataSource;
@Override
public List <String> create(Employee request) {
Connection conn = null;
conn = dataSource.getConnection();
在这里,我们使用@Qualifier注释来获取适当的数据源。就是这样-现在可以了。我用其他数据源试了一下——效果也很好。
注意: 我不想接受我自己的答案——所以如果其他人有更好、更优雅的解决方案,我会等几天,请回答——我很乐意接受你的答案,而不是回答我自己的问题并接受!
推荐阅读
- flutter - 如何从我的设备访问所有电话联系人
- python - 使用 python 套接字和端口转发的服务器实现
- python - 如何在python中将同时具有字符串和int的数据框的列转换为仅int
- javascript - 如何在 NodeJS 中将 DATA 返回到 API
- python - 求最小化矩阵向量乘积标准差的向量排列
- javascript - 自定义四舍五入逻辑
- flutter - 如何在 Flutter 中禁用 RawMaterialButton?
- reactjs - 如何有条件地导入和重新渲染 app.js
- c++ - 前序树遍历和入栈顺序
- tensorflow - 如何在使用张量板查看混淆矩阵的同时绘制混淆矩阵的实际数字和颜色?