在Spring Data中自定义实现中间存储库

时间:2015-09-22 08:49:22

标签: java spring spring-data

我在项目中使用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的属性“保存”,这是不存在的。有没有办法实现接口,进一步扩展其他接口?

1 个答案:

答案 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 {
}

希望这会有所帮助