简体   繁体   English

Spring JPA自定义存储库不起作用

[英]spring jpa custom repository not working

Trying to create a custom repository implementation with spring and getting the following error: 尝试使用spring创建自定义存储库实现并收到以下错误:

caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No
  qualifying bean of type [com.mynamespace.domain.repository.GenericRepositoryImpl] 
  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)} 

Here is my code (download it from https://dl.dropboxusercontent.com/u/11115278/src-spring-problem/SpringSimple.zip.renameit ): 这是我的代码(可从https://dl.dropboxusercontent.com/u/11115278/src-spring-problem/SpringSimple.zip.renameit下载):

public class GenericRepositoryImpl<T, ID extends Serializable> extends
        SimpleJpaRepository<T, ID> implements GenericRepository<T, ID> {

    private static final long serialVersionUID = 1L;

    private EntityManager entityManager;
    private Class<T> domainClass;

    public GenericRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {

        super(domainClass, entityManager);

        this.entityManager = entityManager;
        this.domainClass = domainClass;
    }

    public List<T> someCustomMethod(Long orgId) {

        return super.findAll();
    }
}

The intermediate interface 中间接口

@NoRepositoryBean
public interface GenericRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {

  List<T> someCustomMethod(Long orgId);
}

Custom Factory bean 定制工厂豆

public class GenericRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable>
  extends JpaRepositoryFactoryBean<R, T, I> {

  static Logger logger = LoggerFactory.getLogger(GenericRepositoryFactoryBean.class);

  protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {

    logger.debug("#### GenericRepositoryFactoryBean : createRepositoryFactory #################");
    return new GenericRepositoryFactory(entityManager);
  }

  protected static class GenericRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

    private EntityManager entityManager;

    public GenericRepositoryFactory(EntityManager entityManager) {
      super(entityManager);
      logger.debug("#### GenericRepositoryFactory : createRepositoryFactory #################");
      this.entityManager = entityManager;
    }

    protected Object getTargetRepository(RepositoryMetadata metadata) {
      logger.debug("#### GenericRepositoryFactory : getTargetRepository #################");
       logger.debug("#### GenericRepositoryFactory : getTargetRepository metadata.domainType - %1 entityManager - %2",metadata.getDomainType(),entityManager);
      return new GenericRepositoryImpl<T, I>((Class<T>) metadata.getDomainType(), entityManager);
    }

    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
      logger.debug("#### GenericRepositoryFactory : getRepositoryBaseClass #################");
      // The RepositoryMetadata can be safely ignored, it is used by the JpaRepositoryFactory
      // to check for QueryDslJpaRepository's which is out of scope.
      return GenericRepositoryImpl.class;
    }
  }
}

Spring configuration 弹簧配置

<jpa:repositories base-package="com.mynamespace.domain.repository" 
  factory-class="com.mynamespace.domain.factory.GenericRepositoryFactoryBean"/> 

<bean id="entityManagerFactory"
  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="Mypu" />
  <property name="dataSource" >
    <jee:jndi-lookup id="dataSoruce" jndi-name="java:comp/env/jdbc/MyDS" />
  </property>
  <property name="packagesToScan" value="com.mynamespace.domain.model" />
  <property name="jpaVendorAdapter">
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
          <property name="generateDdl" value="false"/>
          <property name="showSql" value="false"/>
          <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
      </bean>
  </property>
</bean>

<!--TransactionManager-->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="txManager"/>

Additional info: I'm using Spring MVC, I have a config file for Spring MVC and another files for data and this is my Spring MVC file: 附加信息:我正在使用Spring MVC,我有一个Spring MVC的配置文件和另一个数据文件,这是我的Spring MVC文件:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <import resource="classpath:spring/*.xml"/>
    <context:component-scan base-package="com.mynamespace.controllers"/>

    <mvc:annotation-driven />
    <mvc:resources mapping="/css/**" location="/WEB-INF/resources/css/" />
    <mvc:resources mapping="/js/**" location="/WEB-INF/resources/js/" />
    <mvc:resources mapping="/images/**" location="/WEB-INF/resources/images/" />
    <mvc:resources mapping="/font/**" location="/WEB-INF/resources/font/" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
            <property name="prefix" value="/WEB-INF/view/"/>
            <property name="suffix" value=".jsp"/>
    </bean>

</beans>

Is not working :( any help? 不起作用:(有帮助吗?

The exception seems to indicate that you refer to the GenericRepositoryImpl from an injection point somewhere in your application classes. 异常似乎表明您从应用程序类中某个位置的注入点引用了GenericRepositoryImpl The samples unfortunately don't show where from exactly. 不幸的是,样本没有显示确切的位置。 Adding more of the original stack trace might help to identify the root cause of the problem. 添加更多的原始堆栈跟踪信息可能有助于确定问题的根本原因。 It's definitely an application component trying to autowire the implementation class directly. 绝对是试图直接自动连接实现类的应用程序组件。

Make sure you still you let your application repositories extend GenericRepository and only inject those into your services, controllers, etc. 确保您仍然让应用程序存储库扩展GenericRepository并将它们仅注入到服务,控制器等中。

EDIT: The comment thread below resulted from a misunderstanding regarding the provided sample code. 编辑:下面的注释线程是由于对提供的示例代码有误解而导致的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM