簡體   English   中英

Spring Boot Weblogic 12c JNDI 數據源:注入不起作用導致 NullPointerException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM