2013-02-27 51 views
14

我試圖在我的自定義實現(UserRepositoryExtensionImpl)中獲取對我的存儲庫接口(UserRepository)的引用,以便訪問Spring JPA提供的所有方法。CrudRepository在我的自定義存儲庫實現中

界面污物擴展:

@Repository 
public interface UserRepository extends CrudRepository<User, String>, UserRepositoryExtension<RosterUser> { 
    ...any custom spring JPA methods... 
} 

擴展接口:

@Repository 
public interface UserRepositoryExtension <T> { 
    public T put(T entity); 
} 

定製實施:

public class UserRepositoryExtensionImpl implements UserRepositoryExtension<User> { 

    UserRepository userRepository; 

    @Autowired 
    public UserRepositoryExtensionImpl(UserRepository userRepository) { 
     this.userRepository = userRepository; 
    } 

    @Override 
    public User put(User user) { 
     System.out.println(user + "was put"); 
     // ...put logic here 
     return null; 
    }... 
} 

但是,我無法注入UserRepository由於循環依賴存在(因爲UserRepository擴展了實現的接口我的UserRepositoryImpl)。我收到以下錯誤:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ' userRepositoryImpl': Requested bean is currently in creation: Is there an unresolvable circular  reference? 

一種可能,但不太理想的解決辦法是注入和EntityManagerUserRepositoryImp,但在這種情況下,我沒有任何的所提供的春天JPA方法訪問CrudRepository或我可能在UserRepository中創建的任何其他方法。

有關如何解決此問題的任何建議?

任何幫助將不勝感激。

編輯:正如@雪萊的答覆中提到,我能夠通過使3次修改解決這個問題:

  • 卸下@RepositoryUserRepositoryExtensionImpl
  • 重命名UserRepositoryExtensionImplUserRepositoryImpl。顯然這讓Spring意識到了實現的存在。見Spring Doc
  • 刪除我的構造函數和移動@AutowireduserRepository

的成功!

+0

如果沒有任何實際的循環依賴關係(即:春只是感到困惑,因爲它認爲你有相似類型的許多豆)。添加額外的限定符,比如bean id,以便Spring知道自動裝配哪個bean。 – gerrytan 2013-02-28 00:27:42

+0

給我們你的春天應用程序上下文 – Elbek 2013-02-28 03:49:51

+1

@gerrytan - 我可能是錯的,但我不認爲這是一個循環依賴。 FYI:同樣的問題被提到[這裏](http://forum.springsource.org/showthread.php?132889-Spring-Data-Calling-default-CRUD-methods-inside-a-custom-repository-implementation&p= 439701#post439701) – 2013-02-28 16:41:59

回答

9

一對夫婦的小事情需要爲了改變這個工作:

  • 從定製庫接口(UserRepositoryExtension)拆下@Repository註解。

  • 自定義存儲庫實現實際上應該命名爲「<StandardRepository>Impl」而不是「<CustomRepository>Impl」。在你的代碼示例中,這應該是UserRepositoryImpl而不是UserRepositoryExtensionImpl

+0

謝謝@shelley!你的建議,除了將'@ Autowired'從構造函數移動到'userRepository'字段解決了這個問題。我現在可以在我的自定義實現中引用UserRepository。 :) – 2013-02-28 22:14:16

0

有一個well defined way to create custom repository implementations in Spring Data JPA你應該遵循。基本上你需要擴展CrudRepository,所以你不必在自定義實現中注入它的一個實例。

+0

我認爲OP遵循這種方法,但想要使用自定義存儲庫實現中標準存儲庫bean的方法。 – shelley 2013-02-28 15:05:16

+0

@ zagyi,雪莉是對的。我試圖按照Spring提出的方法,這就是我發現自己處於我所處的位置的方式。爲了使問題更清楚,我將在此問題中添加更多細節。 – 2013-02-28 16:16:46

+0

@shelley,@Julian:對不起,以後重新仔細閱讀問題,很明顯,我嚴重誤會了吧。不過,我認爲朱利安嘗試做這件事很奇怪。通常它是一個服務類,您將注入存儲庫實例並實現調用一個或多個存儲庫操作的更高級別的方法。檢查將'put()'的邏輯高一級移動到服務接口/類中會更有意義。 – zagyi 2013-02-28 16:44:30

0

我已經通過注入ApplicationContext和使用applicationContext.getBean(UserRepository.class)在偷懶的辦法讓豆解決的問題。 它以這種方式工作。

4

正如雪萊指出,該命名是非常重要的,使自動裝配工作。在下面的例子中,我遵循我的自定義界面及其實現的正確命名標準。但我的接口,擴展了JpaRepository被評爲「ItemDao」而不是「ItemRepository」,這導致了春天完全忽略我的自定義實現...

OBS!應該是「ItemRepository」

@Repository 
public interface ItemDao extends JpaRepository<Item, Long>, ItemRepositoryCustom {} 

我的界面

interface ItemRepositoryCustom {...} 

我實現類

class ItemRepositoryImpl implements ItemRepositoryCustom {...} 

如果有人有類似的問題,通過遵循在彈簧文檔中使用的命名標準開始在下面的鏈接。

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-implementations

+1

我希望更詳細地提到這些細節......但是,命名似乎非常重要。很高興你能弄明白! – 2013-05-23 03:21:01

+1

對於我來說,如果您在沒有以前的spring知識的情況下閱讀文檔的一部分,則無法找出命名規則的嚴格程度。 – Olle89 2013-05-23 08:21:08

相關問題