【发布时间】:2015-01-04 14:16:08
【问题描述】:
我正在尝试构建使用大量泛型的可扩展应用程序。到目前为止我有代码:
@Component
@Named
@Scope("session")
@Repository
public interface FrameworkRepository<E extends FrameworkEntity>
extends PagingAndSortingRepository<E, Long> {
}
@Component
@Named
@Scope("session")
@Repository
public interface OrderRepository extends FrameworkRepository<Order> {
}
@Component
@Named
@Scope("session")
public class FrameworkService<R extends FrameworkRepository> implements Serializable {
@Autowired
private R repository;
}
@Component
@Named
@Scope("session")
public class OrderService extends FrameworkService<OrderRepository> {
public OrderService() {
}
}
但是,当我尝试在 facelets 页面中使用 OrderService 实例时,消息出现异常:
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [...FrameworkRepository]
found for dependency:
expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我想,根本问题可能是我对泛型的使用。也许 Spring Data(存储库)无法从 OrderRepository 接口自动创建类,或者 Spring @Autowired 无法找到 OrderRepository 的实例(由 Spring Data 动态创建)并将其自动装配到通用字段中。
我知道在任何时候我都可以在不使用泛型的情况下找到解决方法,但这涉及到很多不必要的代码。泛型可以带来更简洁的代码。
我使用 Hibernate 4.x、Spring 4.x、JPA 2.1。
【问题讨论】:
-
您是否尝试过使用
@Qualifier注释按名称自动装配? -
谢谢,问题已经解决了。
-
在单个类和这种情况根本没有意义,因为它是一个接口。您的存储库应该是单例的,而不是会话范围的,它们不保持状态,因此将它们设置为会话范围没有意义(只会增加复杂性)。恕我直言,当您拥有通用服务层时,您的抽象是错误的……具有保存或更新方法的服务没有意义,它应该提供用例/服务。
-
您的存储库上的注释可能是不必要的,Spring-data 应该在没有 tham 的情况下工作。
@Scope("session")是最糟糕的,没有意义。
标签: java spring hibernate generics spring-data