gpt4 book ai didi

java - Spring Boot Weblogic 12c JNDI 数据源 : injection not working gives NullPointerException

转载 作者:行者123 更新时间:2023-11-30 05:34:59 25 4
gpt4 key购买 nike

我在这里问了一个问题,但不完整,被标记为重复 here

因此,根据已经提出的问题 - @surasin-tancharoen 的一个特定答案似乎正是我所需要的。

但是,尝试这样做也会给我一个 NullPointerException ,因为数据源从未创建/注入(inject)。

详细信息如下:

在下面的代码中我定义了 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 ,因此数据源未注入(inject):

conn = dataSource.getConnection();

所有这一切都是通过将 Spring Boot 应用程序部署到 Weblogic 12c 来尝试的

最佳答案

该解决方案与“DataSourceBuilder”的错误使用有关,“DataSourceBuilder”不应用于 JNDI 数据源。

这是我如何让它工作的:(在weblogic上部署spring boot war并使用weblogic中定义的数据源)

首先我们指定weblogic中定义的数据源 - 这里我们指定weblogic中定义的数据源的JNDI名称:

spring.datasource.xyz.jndi-name=XYZDS
spring.datasource.test.jndi-name=TESTDS

这是使用上面定义的属性创建并公开数据源的位置:我们将 application.properties 中的属性注入(inject)到字符串变量中以存储数据源的 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注释来选取适当的数据源。就是这样 - 现在可以了。我用其他数据源尝试过 - 它也有效。

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

关于java - Spring Boot Weblogic 12c JNDI 数据源 : injection not working gives NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com