2017-02-09 59 views
14

我們有一個基本的JPA存儲庫類,其中有一些額外的實用方法,我們在我們的項目中使用。繼Spring Data JPA documentation我們創建的類,並使用@EnableJpaRepositories註釋的配置類,如下面的例子:有沒有辦法使用spring boot自動配置註冊存儲庫基類?

@Configuration 
@EnableJpaRepositories(basePackageClasses = MyApplication.class, 
    repositoryBaseClass = MyJpaRepositoryImpl.class) 
public class SpringDataJpaMyRepositoryConfiguration { 
} 

我們還設置了basePackageClasses屬性,這樣我們的倉庫中發現,作爲配置類不是在應用程序根包中。一切都按預期工作,所以目前沒有問題。

現在我們想創建一個spring引導啓動器來將存儲庫基類添加到我們的項目中,而無需進一步配置,但我們不知道如何去做。如果我們創建與EnableJpaRepositories自動配置類註釋設置repositoryBaseClass屬性,自動存儲庫查找策略,查找儲存庫@SpringBootApplication註解類下不工作了。

而且我們不能使用basePackageClasses屬性作爲我們不知道使用自動配置的項目的主要類或包。

有沒有辦法做到這一點?也許通過在我們的自動配置中重新定義一些bean?

理想的方式是允許設置存儲庫基類,而無需再次定義所有的Spring Data JPA自動配置。

+0

我就吃克同樣的問題,仍然在尋找解決方案。不幸的是,rdlopes和dan.jones提供的答案並不能解決問題。 –

回答

1

編輯:我已經差不多重寫我的答案 - 我誤會了原來的問題

這不是最好的解決辦法,但我可以看到這個工作的唯一方法是通過規劃環境地政司內部@EnableJpaRepositories。然後

這可以去你的自動配置和使用@ConditionalOnProperty只自動配置如果基礎包屬性設置

@Configuration 
@ConditionalOnProperty("repositories-base-packages") 
public class BaseRepositoryAutoConfiguration { 

    @Configuration 
    @EnableJpaRepositories(
      repositoryBaseClass = MyJpaRepositoryImpl.class, 
      basePackages = "${repositories-base-packages}" 
    ) 
    public static class JpaRepositoriesConfig { } 

} 

然後確保你有一個application.propertiesapplication.yml定義repositories-base-packages你的應用程序中。

不知道你如何聲明多個基礎包,我的SpEL知識是原始的,所以不知道它甚至是可能的。

+0

感謝您的回答,但它並沒有解決我們的問題。您的配置將包設置爲使用JPA註釋查找類,但是我們的問題依賴於查找Spring Data JPA存儲庫,這不一樣。此外,我正在尋找一種不需要進一步配置的解決方案,無論是配置類還是屬性。否則,我們目前的配置類很簡單。 –

+0

對不起,我誤解了這個問題。我已經用另一個解決方案更新了答案。這是有效的,但不知道是否可以聲明多個基本包,具有更多Spl的用戶需要發表評論 –

+0

再次感謝,但我們正在尋找不需要進一步配置的解決方案,甚至不需要配置屬性。我們希望設置存儲庫基類,並保留spring引導啓動器爲彈簧數據jpa提供的默認自動配置,或者至少提供相同的自動配置級別。 –

1

這個問題在當時讓我發瘋,所以我想我可以幫你解決這個問題。

基本上,這個想法是:

  • 你的JPA配置創建一個配置類
  • 添加@EntityScan和@EnableJpaRepositories引用相同的配置類作爲basePackageClass
  • 導入此配置類您的自動配置
  • 創建一個註釋,然後您可以在需要的地方重新使用Jpa配置

在您的示例中,您使用Spring應用程序類作爲掃描的基礎。

我已經提出了一個樣本項目在https://github.com/rdlopes/custom-jpa-demo

在這個例子中,以POC的主要思路,還有一個供JPA實體/庫露出了JPA配置一個項目:

@Configuration 
    @EntityScan(basePackageClasses = JpaConfiguration.class) 
    @EnableJpaRepositories(basePackageClasses = JpaConfiguration.class, 
          repositoryBaseClass = BaseRepositoryImpl.class) 
    public class JpaConfiguration { 

    } 

要小心對於您的存儲庫的常見實現,您需要顯示特殊簽名:

@NoRepositoryBean 
public class BaseRepositoryImpl<T, ID extends Serializable> 
     extends SimpleJpaRepository<T, ID> 
     implements BaseRepository<T, ID> { 

    public BaseRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) { 
     super(entityInformation, entityManager); 
    } 

    @Override 
    public String someCustomMethod(ID id) { 
     return "Class for entity of id " + id + " is: " + getDomainClass().getSimpleName(); 
    } 
} 

然後,您可以創建自動配置爲s UCH:

@Configuration 
@ConditionalOnClass(CustomJpaRepositories.class) 
@Import(JpaConfiguration.class) 
public class JpaCustomAutoConfiguration { 

} 

提供了一個註解讓事情變得整潔,在這裏你需要JPA使用它:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
public @interface CustomJpaRepositories { 
} 

使用您的JPA班會具有此註釋,你打電話給你的JPA庫一樣簡單:

@SpringBootApplication 
@CustomJpaRepositories 
public class CustomJpaSampleApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(CustomJpaSampleApplication.class, args); 
    } 

    @Bean 
    public CommandLineRunner dataInitializer(UserRepository userRepository) { 
     return args -> { 
      User user1 = new User(); 
      user1.setName("user 1"); 
      userRepository.save(user1); 

      User user2 = new User(); 
      user2.setName("user 2"); 
      userRepository.save(user2); 

      userRepository.findAll() 
          .forEach(user -> System.out.println(
            userRepository.someCustomMethod(user.getId()))); 
     }; 
    } 
} 

希望這有助於你獲得通過的撓頭時刻:-)

+0

謝謝睿,獲取信息和示例項目。但是,這不是我們真正需要解決的問題。我們不提供提供基本存儲庫類的庫中的實體和存儲庫,應將其包含在每個項目中。但是您可以輕鬆地在示例項目中重現我們的場景,只需將_User_實體和_UserRepository_從_custom-jpa_模塊移動到_custom-jpa-demo_模塊。你是否偶然地解決了這種情況? –

+0

目前尚不清楚你能做什麼,不能做什麼改變。例如,您可以想象通過自動裝配將您的實用程序注入到自定義存儲庫中。您也可以在自動配置中使用不同的@Configuration來引用一組不同的bean並使用組合模式。問題是我們沒有一個清晰的架構來解決您的問題,我想這就是爲什麼其他答案也不符合您的要求。 – rdlopes

+0

我很樂意回答您有任何疑問或添加更多信息。另一個答案几乎是正確的,唯一的問題是它不能解決在應用程序中不需要進一步配置的要求。這個要求是我認爲很難解決的。 –

相關問題