繁体   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