【问题标题】:Spring Boot: How to Disable JNDI lookup and use spring.datasource instead for Testing?Spring Boot:如何禁用 JNDI 查找并使用 spring.datasource 代替测试?
【发布时间】:2023-03-05 17:10:01
【问题描述】:

我希望我的主 Spring Boot 应用程序通过 JNDI 配置我的数据源

spring.datasource.jndi-name=java:jboss/datasources/MyAppDS

在我的application.properties 文件中。

有时,我想使用不同的数据源设置,以便能够使用内存数据源(即H2)运行我的测试用例。 我在src/test/resources 下创建了一个单独的application.properties 文件,其中包含以下内容:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

但是,测试文件似乎不喜欢这样,我收到以下错误:

[main] WARN  o.s.w.c.s.GenericWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/JndiDataSourceAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException: Failed to look up JNDI DataSource with name 'java:jboss/datasources/MyAppDS'; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

导致我的测试失败。

我做过的事情:

src/test/resources 中将我的属性文件重命名为testapplication.properties 并使用

更新内容
spring.mydatasource.driver-class-name=org.h2.Driver
spring.mydatasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.mydatasource.username=sa
spring.mydatasource.password=sa

并将以下注释添加到我的测试类中:

@RunWith(SpringRunner.class)
@WebAppConfiguration("classpath:META-INF/web-resources")
@TestPropertySource(locations="classpath:testapplication.properties")
@ConfigurationProperties(prefix="spring.mydatasource")
public class BrandsSvcTests {

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext wac;  

    @Before
    public void setup() throws Exception {
         this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

      // ... my test cases
}

我在这里错过了什么?

【问题讨论】:

  • 删除 ConfigurationProperties 注释,并在 testapplication.properties 文件中使用标准属性名称。
  • 它不起作用。这就是我尝试添加 Config 注释的原因。
  • 如何它不起作用?您预计会发生什么,而恰恰相反会发生什么?
  • 让我将我的项目精简到最小的可行实施并尝试您的建议。
  • 请自行提供完整的答案。

标签: java spring spring-boot datasource jndi


【解决方案1】:

我的情况与提出的问题完全相同,并且错误相同。这对我有用。

您可以将以下内容添加到您的 src/test/resources/application.properties 以便在测试期间不会发生 jndi 查找 -

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2015-08-16
    • 2016-01-02
    • 1970-01-01
    • 2018-04-27
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多