Spring Data JPA中“向所有存储库添加自定义行为”的几个问题

3
我使用Spring data jpa,并尝试按照此处描述的方式向所有仓库添加自定义行为: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories 我遇到了几个问题:
首先,在Spring文档中描述的RepositoryMetadata类中不存在getDomainClass方法,如下所示:
protected Object getTargetRepository(RepositoryMetadata metadata) {
      return new MyRepositoryImpl<T, I>((Class<T>) metadata.getDomainClass(), entityManager);
}

我使用了以下方法:getDomainType()。这样做正确吗?
其次,我的应用程序在tomcat启动时抛出异常。以下是完整的堆栈跟踪:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'globalRepositoryImpl' defined in file [E:\users\jumartin\dev_sts\.metadata\.plugins\org.eclipse.wst.server.core\
tmp0\wtpwebapps\SuiviTRC\WEB-INF\classes\trc\suivi\repository\GlobalRepositoryImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could
 not instantiate bean class [trc.suivi.repository.GlobalRepositoryImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: trc.suivi.repository.GlobalRepositoryImpl.<i
nit>()

这是我自定义的全局存储库代码:

public class GlobalRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements GlobalRepository<T, ID> {

    private EntityManager em;

    public GlobalRepositoryImpl(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
        this.em = em;
    }

    public void sharedCustomMethod(ID id) {

    }

}

这是我的XML配置:

<repositories base-package="trc.suivi.repository" factory-class="trc.suivi.repository.GlobalRepositoryFactoryBean">
        <repository id="pliRepository" />
        <repository id="globalRepository" />
    </repositories>

我在网上找不到其他示例。请问有人能帮忙吗?
3个回答

2

1
自Spring Data JPA 1.9.M1版本起,向所有由Spring Data管理的存储库添加自定义方法变得更加容易。 这个示例包含了所有细节。
在您的情况下,示例看起来应该是:
1)配置
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(repositoryBaseClass = GlobalRepositoryImpl.class)
class CustomRepositoryConfig {}

2) 自定义基础仓库:

public class GlobalRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements GlobalRepository<ID> {

    public GlobalRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
    }

    @Override
    public void sharedCustomMethod(ID id) {

    }
}

3) 一些代码库:

public interface SomeRepository extends GlobalRepository<User, Long> {}

当然,GlobalRepository 仍需要用 @NoRepositoryBean 进行注释。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接