Spring 引导 Weblogic 12c JNDI 数据源:注入不起作用给出 NullPointerException

Spring Boot Weblogic 12c JNDI DataSources: injection not working gives NullPointerException

我在这里问了一个问题,但不完整,被标记为重复 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 启动应用程序部署到 Weblogic 12c

来尝试的

该解决方案与 'DataSourceBuilder' 的不正确使用有关,不应将其用于 JNDI 数据源。

这是我如何让它工作的: (在 weblogic 上部署 spring 启动 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注解

这在使用此数据源的代码段中很重要。 所以现在数据源创建成功并公开了。

好的食用时间:

@Repository
public class SomeDaoImpl {

@Autowired
@Qualifier("XyzDataSource")
DataSource dataSource;

@Override
public List <String> create(Employee request) {

    Connection conn = null;
    conn = dataSource.getConnection();

这里我们使用 @Qualifier 注释来选取适当的数据源。 就是这样-现在可以使用了。 我用其他数据源尝试过 - 它也能正常工作。

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