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

Java 如何将常用方法从Spring存储库提取到默认接口方法中?,java,spring,Java,Spring,代码中有很多地方如下所示: @Query("SELECT ...") List<Foo> findAllRu(); @Query("SELECT ...") List<Foo> findAllEn(); default List<Foo> findAll(){ if (CurrentLocale.isRu()){ return findAllRu(); } else { return findAllE

代码中有很多地方如下所示:

@Query("SELECT ...")
List<Foo> findAllRu();

@Query("SELECT ...")
List<Foo> findAllEn();

default List<Foo> findAll(){
    if (CurrentLocale.isRu()){
        return findAllRu();
    }
    else {
        return findAllEn();
    }
}
然后使用它扩展存储库接口:

@EnableJpaRepositories
public interface FooRepository extends
        JpaRepository<Foo, Long>,
        FindAllI18nRepositoryProvider<Foo> {

    @Query("SELECT ...")
    List<Foo> findAllRu();

    @Query("SELECT ...")
    List<Foo> findAllEn();
}
我尝试添加空的
@Query()
注释,但是,这没有帮助

我还尝试为
findAllEn
方法添加
default
实现,但是,在这种情况下,Spring会忽略存储库界面中的
@Query()
注释


所以,我的问题是:是否可以将无状态的
findAll
方法移动到单独的接口中?我不想为存储库接口或诸如此类的东西编写额外的实现类。

我认为这会对您有所帮助,不幸的是,不会。而且,据我所知,这种方法需要手工编写具有存储库实现的底层类,我只是在SpringBootV1.3应用程序中尝试了您的示例,(使用SpringBootStarter数据jpa依赖项),它运行得很好。异常实际上是从
FooRepository
派生的,而不是从其他接口派生的吗?@MartinHansen,是的,异常消息是
创建名为“FooRepository”的bean时出错:调用init方法失败;嵌套异常为org.springframework.data.mapping.PropertyReferenceException:找不到类型Foo的属性findAllRu
@EnableJpaRepositories
public interface FooRepository extends
        JpaRepository<Foo, Long>,
        FindAllI18nRepositoryProvider<Foo> {

    @Query("SELECT ...")
    List<Foo> findAllRu();

    @Query("SELECT ...")
    List<Foo> findAllEn();
}
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!