代码中有很多地方如下:
@Query("SELECT ...")
List<Foo> findAllRu();
@Query("SELECT ...")
List<Foo> findAllEn();
default List<Foo> findAll(){
if (CurrentLocale.isRu()){
return findAllRu();
}
else {
return findAllEn();
}
}
我想将findAll
实现提取到单独的界面中:
public interface FindAllI18nRepositoryProvider<T> {
List<T> findAllRu();
List<T> findAllEn();
default List<T> findAllI18n() {
return CurrentLocale.isRu() ? findAllRu() : findAllEn();
}
}
然后用它扩展存储库接口:
@EnableJpaRepositories
public interface FooRepository extends
JpaRepository<Foo, Long>,
FindAllI18nRepositoryProvider<Foo> {
@Query("SELECT ...")
List<Foo> findAllRu();
@Query("SELECT ...")
List<Foo> findAllEn();
}
但是,Spring无法使用这样的接口方法启动应用程序:
java.lang.IllegalStateException: Failed to load ApplicationContext
...
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fooRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findAllRu found for type Foo!
...
org.springframework.data.mapping.PropertyReferenceException: No property findAllRu found for type Foo!
我尝试添加空@Query()
注释,但是,这没有帮助。
我还试图为default
方法添加findAllEn
实现,但是,在这种情况下,Spring忽略了存储库界面中的@Query()
注释。
所以,我的问题是:是否可以将无状态findAll
方法移动到单独的接口中?我不想为存储库接口或类似的东西编写额外的实现类。