Spring Data 2.x:将客户行为添加到所有存储库

好奇的

我有一个使用Spring Data 1.6.1.RELEASE构建的Web应用程序。通过遵循Spring Data在线文档中的示例,它还将自定义行为添加到所有存储库中:

1.3.2向所有存储库添加自定义行为https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

基本上,它使用以下所示的自定义行为扩展了JpaRepository:

public interface MyRepository<T, ID extends Serializable> 
  extends JpaRepository<T, ID> {

  void sharedCustomMethod(ID id);
}

这是用于实现此新接口的代码:

public class MyRepositoryImpl<T, ID extends Serializable>
  extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {

  private EntityManager entityManager;

  public MyRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
    super(domainClass, entityManager);

    this.entityManager = entityManager;
  }

  public void sharedCustomMethod(ID id) {
    // implementation goes here
  }
}

定制存储库工厂bean:

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

  protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {

    return new MyRepositoryFactory(entityManager);
  }

  private static class MyRepositoryFactory<T, I extends Serializable> extends JpaRepositoryFactory {

    private EntityManager entityManager;

    public MyRepositoryFactory(EntityManager entityManager) {
      super(entityManager);

      this.entityManager = entityManager;
    }

    protected Object getTargetRepository(RepositoryMetadata metadata) {

      return new MyRepositoryImpl<T, I>((Class<T>) metadata.getDomainClass(), entityManager);
    }

    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {

      // The RepositoryMetadata can be safely ignored, it is used by the JpaRepositoryFactory
      //to check for QueryDslJpaRepository's which is out of scope.
      return MyRepository.class;
    }
  }
}

这是工厂bean的声明:

<repositories base-package="com.acme.repository"
  factory-class="com.acme.MyRepositoryFactoryBean" />

Spring Data 1.6.1.RELEASE一切都很好。但是,切换到Spring Data 2.3.2.RELEASE后,在Eclipse中启动Jetty时出现以下异常:

java.lang.IllegalStateException: No suitable constructor found on interface com.acme.repository.MyRepository to match the given arguments: [class org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation, class com.sun.proxy.$Proxy52]. Make sure you implement a constructor taking these
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.lambda$getTargetRepositoryViaReflection$4(RepositoryFactorySupport.java:522)
    at java.util.Optional.orElseThrow(Optional.java:290)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepositoryViaReflection(RepositoryFactorySupport.java:522)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getTargetRepositoryViaReflection(RepositoryFactorySupport.java:506)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:180)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:162)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:72)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:309)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:212)
    at org.springframework.data.util.Lazy.get(Lazy.java:94)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1853)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1790)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:516)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:324)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:878)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:401)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:292)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:843)
    at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:533)
    at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:816)
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:345)
    at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1406)
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1368)
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:778)
    at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:262)
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:522)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:131)
    at org.eclipse.jetty.server.Server.start(Server.java:427)
    at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)
    at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
    at org.eclipse.jetty.server.Server.doStart(Server.java:394)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at net.sourceforge.eclipsejetty.starter.jetty9.Jetty9Adapter.start(Jetty9Adapter.java:68)
    at net.sourceforge.eclipsejetty.starter.common.AbstractJettyLauncherMain.launch(AbstractJettyLauncherMain.java:84)
    at net.sourceforge.eclipsejetty.starter.jetty9.Jetty9LauncherMain.main(Jetty9LauncherMain.java:42)

我该如何解决?

更新

我添加了以下构造函数,但仍然存在相同的问题:

public MyRepositoryImpl(
        JpaMetamodelEntityInformation<T, ID> entityInformation,
        EntityManager entityManager) {
   super(entityInformation, entityManager);
   this.em = entityManager;

}

卡维萨卡兰(Kavithakaran)

我只是使用设置了一个应用程序,2.3.2.RELEASE它的外观看起来已经简化了。

  1. 删除 MyRepositoryFactoryBean

  2. 替换<repositories base-package="com.acme.repository...

    <repositories base-package="com.acme.repository"
     base-class="….MyRepositoryImpl" />
  1. MyRepositoryImpl
    public class MyRepositoryImpl<T, ID extends Serializable>
        extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {

       private EntityManager entityManager;

       MyRepositoryImpl(JpaEntityInformation entityInformation,
                     EntityManager entityManager) {
        super(entityInformation, entityManager);

        // Keep the EntityManager around to used from the newly introduced 

        this.entityManager = entityManager;
       }

       public void sharedCustomMethod(ID id) {
        // implementation goes here
       }
     }
  1. 确保MyRepository不在包装内,base-packagecom.acme.repository

注意

  • @EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class)在带注释的类@Configuration上的等效于点2。只要该配置类的包是com.acme.repository

  • @NoRepositoryBean上的注释MyRepository等效于点4

带有Java配置的示例Spring Boot应用程序供参考

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Data Rest将自定义端点添加到特定存储库

将多个客户端添加到Spring OAuth2 Auth Server

将数据库身份验证添加到Spring Data Rest应用程序

将链接添加到Spring Data REST Repository资源

将JPA存储库添加到Spring时出错

Spring Data MongoDB将数组添加到现有文档

将spring-data-rest-repository添加到spring-data-rest-webmvc

Spring Data JPA将Joda Money的总和分为2列

将文件添加到cocos2d-x项目的所有平台

Spring Data R2DBC-在反应存储库中构建自定义PostgreSQL查询

Spring Boot 2是否会有spring-data-aerospike版本?

如何添加到Spring Data REST投影的链接?

Spring thymeleaf将th:text添加到data-def-val

如何将Oracle驱动程序依赖项添加到Spring Data Flow Server?

Spring Data Rest将链接添加到根-RepositoryLinksResource无法转换为Resource

在将请求添加到MongoDB之前如何处理Spring Data中的插入请求?

Spring Data Rest-将链接添加到搜索端点

如何使用Spring Data Rest将新的_link添加到实体?

我如何将 CORS 添加到 Spring Data rest 公开的“/profile”端点

saveOrUpdate 在带有 H2 数据库的 Spring Data 中不起作用

Spring Data Rest通过一个Crud存储库管理所有实体

如何将内容添加到Spring oauth2访问令牌?

将 google login_hint 参数添加到 Spring oauth2 AuthorizationCode 请求中

Spring Data比较2个日期范围

Spring Data存储库:将获取大小设置为参数

单个事务中有多个Spring Data JPA存储库

具有Java 8流的Spring Data JPA存储库

Spring Data(JPA)多个存储库,没有很多类

如何将2个Java项目添加到相同的位存储库