2015-09-22 117 views
2

我在我的項目中使用了Spring Data,並且我有大量的存儲庫。現在,我想一個方法添加到一些倉庫的,但不是所有的人,所以我創建了一個接口「LoggingRepositoryCustom」,即(簡體)看起來是這樣的:在Spring數據中自定義實現中間存儲庫

@NoRepositoryBean 
public interface LoggingRepositoryCustom<T extends IEntity, ID extends Serializable> { 
    <S extends T> S save(S entity, AppUser author); 
} 

正如我需要有一個這個自定義實現,我也創建了「LoggingRepositoryImpl」,實現該接口:

@NoRepositoryBean 
public class LoggingRepositoryImpl<T extends IEntity, ID extends Serializable> implements LoggingRepository { 
     @Override 
     public <S extends T> S save(S entity, AppUser author) { 
      //impl 
     } 
} 

最後,我有一些庫,應該擁有上述functionity,如「AppUserRepo」:

@Repository 
public interface AppUserRepo extends PagingAndSortingRepository<AppUser, Long>, LoggingRepositoryCustom<AppUser, Long> { 
     //methods of this repo 
} 

然而,當我嘗試部署該應用程序,我得到以下異常:

org.springframework.data.mapping.PropertyReferenceException: No property save found for type AppUser! 

看來,自定義實現不會反映春季數據試圖創建一個神奇的方法從名稱約定,從而尋找屬性「保存」的「AppUser」,這是不存在的。有沒有一種方法可以實現一個接口,並由其他接口進一步擴展?

回答

1

我添加了同樣的問題,在我的項目之一,另外,我一樣遵循得到它的工作:

1 - 創建「父」接口和實現:

庫:

@NoRepositoryBean 
public interface LoggingRepository<T extends IEntity, ID extends Serializable> extends PagingAndSortingRepository<T, Long>, LoggingRepositoryCustom<T, ID> { 
} 

資源庫自定義

@Transactional(readOnly = true) 
public interface LoggingRepositoryCustom<T extends IEntity, ID extends Serializable> { 
    <S extends T> S save(S entity, AppUser author); 
} 

的復位器的實現Ÿ定製:

public class LoggingRepositoryImpl<T extends IEntity, ID extends Serializable> implements LoggingRepositoryCustom<T, ID> { 
     @Override 
     public <S extends T> S save(S entity, AppUser author) { 
      //impl 
     } 
} 

2 - 創建您的具體接口和實現:

庫:

@Repository 
public interface AppUserRepo extends LoggingRepository<AppUser, Long>, AppUserRepoCustom { 
} 

庫定製:

public interface AppUserRepoCustom<AppUser, Long> { 
} 

倉庫實現:

public class AppUserRepoImpl extends LoggingRepositoryImpl<AppUser, Long> implements AppUserRepoCustom { 
} 

希望這有助於

+0

好吧,當我實現AppUserRepo和LoggingRepo繼承的方法工作的,但我不希望創建的每一個存儲庫將擴大LoggingRepo的實現,因爲實現是相同的所有的類... –

+0

您需要創建一個「擴展LoggingRepositoryImpl」(在該父級定製倉庫中實現的常用邏輯)的每個單一倉庫的「空」自定義實現,以便告訴spring數據它應該生成這些定製代碼... – Pras

+0

嗯,是的,這或多或少是我的問題的解決方案。但是,如果可以避免創建所有存儲庫的空白實現,那麼我會實現這一點,這將會更好:)謝謝您的回覆! –

相關問題