[英]Spring Boot Data JPA issues with DB/2 Configuration and JUnit
我正在開發一個想要使用spring-boot-data-jpa的項目。 本地(IDE)數據庫可以是H2。 但是,對於所有服務器(dev / test / prod),我們不得不使用DB / 2(不幸的是!)。
我們似乎無法使用DB / 2。 我們得到這樣的錯誤:
java.lang.IllegalStateException: Failed to load ApplicationContext....
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No
qualifying bean of type [...Repository] found for
dependency: expected at least 1 bean which qualifies as autowire candidate for this
dependency. Dependency annotations: {}
在運行單元測試時(JUnit)。 注意,空白{}注釋。 從表面看來,這似乎是一個“明顯”的問題。 無法在類路徑中加載或找到存儲庫bean。 但是,當我們使用H2配置運行它時,它可以正常工作。
因此,下一個邏輯結論似乎是存儲庫配置(數據源等)未正確設置。 但是,我們可以在非Spring啟動應用程序中使用相同的配置值,它工作正常!
所以我認為它可能是不同的類加載器或cglib代理不使用“真正的”實現類。 這樣的問題:
但是,這些問題的正確答案無法解決問題。 所以這是我的帖子/問題。
如何找出這個問題的根本原因? 我試圖在調試器中遍歷代碼(spring和我們的代碼),但無法縮小原因。
所以我試過這個,我拿了示例spring boot jpa並修改它以使用DB / 2的特定屬性,我可以得到同樣的失敗。 因此,我的配置似乎一定是錯誤的,或者Spring代碼中存在錯誤。 我已經與其他人一起查看了配置,但我們沒有看到問題。 我們在另一個(非春季啟動應用程序)中嘗試了此配置並且它可以工作。
這是一個補丁文件 ,顯示原始jpa示例與修改后的配置更改之間的差異。 注意,我們刪除了DB2服務器的詳細信息。 希望這使得問題可以為任何人重現,然后可以幫助找出原因。
TIA,
斯科特
編輯1 ---在這里直接添加配置細節而不是補丁文件---
Java配置
@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource("classpath:application.properties")
public class SampleDataJpaApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleDataJpaApplication.class, args);
}
}
屬性文件
spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.dialect: org.hibernate.dialect.DB2Dialect
#spring.jpa.database-platform: DB2Platform
spring.jpa.show-sql: true
spring.jpa.generate-ddl: true
spring.datasource.driverClassName: om.ibm.db2.jcc.DB2Driver
spring.datasource.url: jdbc:db2:someDB2-db:5000
spring.datasource.username: fakeuser
spring.datasource.password: fakepassword
spring.datasource.schema:schema-name
單元測試配置
@RunWith(SpringJUnit4ClassRunner.class)
@PropertySource("classpath:application.properties")
@ContextConfiguration(classes = SampleDataJpaApplication.class, loader = AnnotationConfigContextLoader.class)
public class CityRepositoryIntegrationTests {
//....
}
這應該與僅修改用戶/密碼/ jdbc URL的修補程序文件幾乎相同,以隱藏環境的細節。
據我所知,JUnit設置不正確。 要讓Boot正常工作,您有兩種選擇:
使用@SpringApplicationConfiguration
而不是@ContextConfiguration
Boot會相當多地配置ApplicationContext
引導過程,例如,啟用默認配置文件。 使用自定義注釋也會自動激活JUnit執行的內容。
自己配置@ContextConfiguration
和相應的偵聽器
在您的情況下,除了注冊的所有默認值之外,您至少需要ConfigFileApplicationContextInitializer
。
由於第二個選項相當繁瑣,我強烈建議選擇第一個選項,看看它在哪里引導你。
奧利弗,
我似乎@SpringApplicationConfiguration
使用how-to中定義的spring-boot-starter-test JAR找到注釋@SpringApplicationConfiguration
。 我正在使用彈簧靴0.5.0.M6。 以下是我的Maven POM中的依賴項。 我在這里缺少什么?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.0.0.RELEASE</version>
</dependency>
編輯 :在查看Spring Boot示例項目后,我發現了一種不同的方法來讓Junit和Spring測試相互配合。 如果您可以像下面這樣定義您的類,那么它應該與Oliver在其對選項1的回復中提到的相同。請注意,需要存在“loader”參數才能正確配置偵聽器和支持bean。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyDataApplication.class, loader = SpringApplicationContextLoader.class)
public class MyServiceTest {
我在Spring Boot中遇到類似的集成測試問題,我可以確認@ user3166395解決方案。
這個配置對我有用:
import org.springframework.boot.test.SpringApplicationContextLoader;
import org.springframework.test.context.ContextConfiguration;
...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyDataApplication.class, loader = SpringApplicationContextLoader.class)
public class MyServiceTest {
@Autowired
CityRepository cityRepository;
}
這需要測試依賴性:
org.springframework.boot:spring-boot-starter-test:0.5.0.M7
我無法使用SpringApplicationConfiguration
實現工作測試
嘿伙計們晚了一點,但要清楚你的錯誤(因為我復制了它,我也有同樣的情況):
spring.datasource.driverClassName: **om**.ibm.db2.jcc.DB2Driver
應該
spring.datasource.driverClassName: **com**.ibm.db2.jcc.DB2Driver
到目前為止,這對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.