![](/img/trans.png)
[英]A JMS XA connection factory injected using spring jee-jndi lookup behaves differently than @Resource injection on Weblogic 12c
[英]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.