首页 > 解决方案 > 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 来尝试的

标签: javaspringspring-bootweblogicjndi

解决方案


该解决方案与不应该用于 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注释来获取适当的数据源。就是这样-现在可以了。我用其他数据源试了一下——效果也很好。

注意: 我不想接受我自己的答案——所以如果其他人有更好、更优雅的解决方案,我会等几天,请回答——我很乐意接受你的答案,而不是回答我自己的问题并接受!


推荐阅读