![](/img/trans.png)
[英]A JMS XA connection factory injected using spring jee-jndi lookup behaves differently than @Resource injection on Weblogic 12c
[英]Spring Boot Weblogic 12c JNDI DataSources: injection not working gives 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);
}
需要注意的幾個關鍵點:我們不應該對 JNDI 數據源使用“DataSourceBuilder”——它不會工作。
這就是為什么它在我的情況下不起作用的原因。
現在我正在使用' JndiDataSourceLookup ',它可以解決問題。
另一件需要注意的是,我們需要使用帶有屬性“name”的標准@Bean 注解。
這在使用此數據源的代碼段中很重要。 所以現在數據源已成功創建並公開。
可以消費的時間:
@Repository
public class SomeDaoImpl {
@Autowired
@Qualifier("XyzDataSource")
DataSource dataSource;
@Override
public List <String> create(Employee request) {
Connection conn = null;
conn = dataSource.getConnection();
這里我們使用@Qualifier注釋來獲取適當的數據源。 就是這樣 - 這現在有效。 我用其他數據源嘗試過 - 它也有效。
注意:我不想接受我自己的答案——所以我會等幾天,如果其他人有更好、更優雅的解決方案,請回答——我會很樂意接受你的答案,而不是回答我自己的問題並接受!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.