Java 接口中实现类的方法在服务类中不可见

Java 接口中实现类的方法在服务类中不可见,java,interface,Java,Interface,我在实现@Repository类中定义了一个方法,它是抽象基类的扩展,并实现了一个接口。但是,在@Repository类中定义的方法在@Service类中不可见,我不确定原因 我有一个@Service类定义为 @Service @Transactional public class CategoryService { @Autowired private IJpaRepository categoryRepository; public CategoryService

我在实现
@Repository
类中定义了一个方法,它是抽象基类的扩展,并实现了一个接口。但是,在
@Repository
类中定义的方法在
@Service
类中不可见,我不确定原因

我有一个
@Service
类定义为

@Service
@Transactional
public class CategoryService {

    @Autowired
    private IJpaRepository categoryRepository;

    public CategoryService(){ } 

    /* service methods */

    public List<Category> findTopLevelCategories(){
         //findTopLevelCategories is not visible here
         return categoryRepository.findTopLevelCategories();
    }

}
@Repository被定义为实现上述接口的抽象类的扩展:

@Repository
public class CategoryRepository extends AbstractJpaRepository<Category> implements IJpaRepository<Category> {

    public List<Category> findTopLevelCategories(){
        Query queryCategoryTopLevel = getEntityManager().createNamedQuery("findTopLevelCategories");
        return queryCategoryTopLevel.getResultList();
    } 

    /* Other overriding methods */

}
@存储库
公共类CategoryRepository扩展了AbstractJpaRepository实现了IJpaRepository{
公共列表findTopLevelCategories(){
Query queryCategoryTopLevel=getEntityManager().createNamedQuery(“FindToLevel类别”);
返回queryCategoryTopLevel.getResultList();
} 
/*其他重写方法*/
}

我最好的猜测是,这是由于
@Autowired
绑定到
IJpaRepository
,而不是实际实现的
CategoryRepository
类。在不对
IJpaRepository
接口进行任何更改的情况下,如何使
类别repository
中定义的新方法对
@Service
类可见?

您的猜测是正确的。您需要定义一个
iterface
,该
扩展IJpaRepository
实现它。然后自动连接
接口
。事实上,它甚至与Spring无关。您有一个对IJpaRepository实例的引用。因此,唯一可用的方法是在IJpaRepository(和Object)中定义的方法。调用FindTopLevel Categories()方法的唯一方法是将categoryRepository引用强制转换为categoryRepository。但是,这反过来又很有可能失败,因为Spring可能会注入一个代理,而不是CategoryRepository的实际实例。
@Repository
public class CategoryRepository extends AbstractJpaRepository<Category> implements IJpaRepository<Category> {

    public List<Category> findTopLevelCategories(){
        Query queryCategoryTopLevel = getEntityManager().createNamedQuery("findTopLevelCategories");
        return queryCategoryTopLevel.getResultList();
    } 

    /* Other overriding methods */

}