spring jpa custom repository not working

亡梦爱人 提交于 2019-12-24 22:45:24

问题


Trying to create a custom repository implementation with spring and getting the following error:

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):

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:

<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?


回答1:


The exception seems to indicate that you refer to the GenericRepositoryImpl from an injection point somewhere in your application classes. 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.

EDIT: The comment thread below resulted from a misunderstanding regarding the provided sample code.



来源:https://stackoverflow.com/questions/19468418/spring-jpa-custom-repository-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!