簡體   English   中英

Spring Boot Data JPA與DB / 2 Configuration和JUnit有關

[英]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正常工作,您有兩種選擇:

  1. 使用@SpringApplicationConfiguration而不是@ContextConfiguration

    Boot會相當多地配置ApplicationContext引導過程,例如,啟用默認配置文件。 使用自定義注釋也會自動激活JUnit執行的內容。

  2. 自己配置@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM