簡體   English   中英

如何在BaseServiceImpl中自動裝配@NoRepositoryBean BaseRepository

[英]how to autowire @NoRepositoryBean BaseRepository in BaseServiceImpl

BaseRepository

@NoRepositoryBean
public interface BaseRepository<T extends BaseEntity, ID extends Serializable>
        extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {

    T findByIdAndDeleteStatusFalse(ID id);
}

BaseServiceImpl

@Transactional(readOnly = true)
public abstract class BaseServiceImpl<T extends BaseEntity, ID extends Serializable> implements BaseService<T, ID> {

    @Autowired
    protected BaseRepository<T, ID> baseRepository;
}

applicationContext.xml中的jpa配置

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.coderbike.entity, com.coderbike.core.entity"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
            <property name="showSql" value="false"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="database" value="MYSQL"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">false</prop>
        </props>
    </property>
</bean>

<!-- annotation transaction -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

<!-- scan repository package -->
<jpa:repositories base-package="com.coderbike.dao.jpa, com.coderbike.core.repository"
                  repository-impl-postfix="Impl"
                  transaction-manager-ref="transactionManager"
                  entity-manager-factory-ref="entityManagerFactory" />

啟動tomcat時,發生錯誤

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.coderbike.core.repository.BaseRepository] found for dependency [com.coderbike.core.repository.BaseRepository<com.coderbike.entity.User, java.lang.Integer>]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1406)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1057)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1019)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:566)
    ... 60 more

我在網上搜索了很長時間。 但最流行的場景是創建BaseRepositoryImpl並自定義擴展JpaRepositoryFactory的BaseRepositoryFactory。 那么我可以使用自動裝配而不是上面的場景。

@NoRepositoryBean的概念不是為您創建特定存儲庫接口的代理實例。 有很好的解釋是在這里

這意味着您可以擴展此BaseRepository接口並提供和實現您自己的接口。 完成后,在xml中聲明該bean。

這意味着沒有可用於實現該依賴關系的BaseRepository bean。

為BaseRepository使用注釋@Component或@Repository,Spring將為您工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM