Spring Boot Weblogic 12c JNDI数据源:注入不起作用会导致NullPointerException

时间:2019-07-01 11:58:10

标签: java spring spring-boot weblogic jndi

我在这里问了一个问题,但不完整,被标记为重复的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 Boot应用程序部署到Weblogic 12c来尝试所有这些操作

1 个答案:

答案 0 :(得分:1)

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

这是我的工作方式: (在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 ',可以解决问题。

要注意的另一件事是,我们需要使用具有属性“名称”的标准@Bean注释。

这对于使用此数据源的代码很重要。 因此,现在数据源已成功创建并公开。

确定要消耗的时间:

@Repository
public class SomeDaoImpl {

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

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

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

在这里,我们使用 @Qualifier 注释来提取适当的数据源。 就是这样-现在可以使用。 我在其他数据源上进行了尝试-效果很好。

注意: 我不想接受我自己的答案-所以如果有其他人有更好和更优雅的解决方案,我将等待几天,请回答-我们很乐意接受您的回答,而不是回答我自己的问题并接受! >