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 注释来选取适当的数据源。
就是这样-现在可以使用了。
我用其他数据源尝试过 - 它也能正常工作。
注意:
我不想接受我自己的回答 - 所以我会等几天如果有人有更好更优雅的解决方案请回答 - 很乐意接受你的回答而不是回答我自己的问题并接受!
我在这里问了一个问题,但不完整,被标记为重复 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 注释来选取适当的数据源。 就是这样-现在可以使用了。 我用其他数据源尝试过 - 它也能正常工作。
注意: 我不想接受我自己的回答 - 所以我会等几天如果有人有更好更优雅的解决方案请回答 - 很乐意接受你的回答而不是回答我自己的问题并接受!