我在项目中使用Spring Data,我有很多存储库。现在我想为一些存储库添加一个方法,但不是全部,所以我创建了一个接口LoggingRepositoryCustom
,(简化)看起来像这样:
@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
}
}
最后,我有一些存储库,应具有上述功能,例如: 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!
似乎没有反映自定义实现,Spring Data尝试从名称约定创建一个神奇的方法,因此寻找AppUser
的属性“保存”,这是不存在的。有没有办法实现接口,进一步扩展其他接口?
答案 0 :(得分: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 {
}
希望这会有所帮助