【问题标题】:autowire Spring repository into generic field (Spring 4, Hibernate 4)将 Spring 存储库自动装配到通用字段中(Spring 4、Hibernate 4)
【发布时间】: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


【解决方案1】:

我必须添加

<jpa:repositories base-package="dk.nmc.imarket.data"
    entity-manager-factory-ref="entityManagerFactory">
</jpa:repositories>

在我的 applicationContext.xml 中,我重新修改了存储库中不必要的注释 - 它们只是存储库,而不是按名称和会话的完整 Spring bean。到目前为止它有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    相关资源
    最近更新 更多