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 */
}