如何从Spring存储库中提取常用方法为默认接口方法?

时间:2016-03-01 12:51:11

标签: java spring

代码中有很多地方如下:

@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方法移动到单独的接口中?我不想为存储库接口或类似的东西编写额外的实现类。

0 个答案:

没有答案