Java Spring5无法找到存储库

Java Spring5无法找到存储库,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有一个SpringFramework5.3.7应用程序,而不是SpringBoot(稍后我将转到SpringBoot)。我正在使用Java配置,到目前为止它运行良好。我有一个多maven模块项目,第一个模块是“myapp实体”。存在包含以下文件的配置目录: @Configuration @PropertySource(value = "file:/opt/myapp/myapp-ws.properties") @EnableTransactionManagement pub

我有一个SpringFramework5.3.7应用程序,而不是SpringBoot(稍后我将转到SpringBoot)。我正在使用Java配置,到目前为止它运行良好。我有一个多maven模块项目,第一个模块是“myapp实体”。存在包含以下文件的配置目录:

@Configuration
@PropertySource(value = "file:/opt/myapp/myapp-ws.properties")
@EnableTransactionManagement
public class AppEntityConfiguration
{
@Value("${hibernate.connection.driver.class}")
private String driverClassName;

@Value("${hibernate.connection.url}")
private String connectionUrl;

@Value("${hibernate.connection.username}")
private String username;

@Value("${hibernate.connection.password}")
private String password;

@Bean
public LocalSessionFactoryBean sessionFactory()
{
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan("com.app.model");
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}

@Bean
public DataSource dataSource()
{
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(connectionUrl);
    dataSource.setUsername(username);
    dataSource.setPassword(password);

    return dataSource;
}

@Bean
public PlatformTransactionManager hibernateTransactionManager()
{
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

private final Properties hibernateProperties()
{
    Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "none");
    hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
    return hibernateProperties;
}

}
myapp-entity.jar可以用Java 11很好地编译,这很好。下一个maven模块是myapp dao,它有一个配置目录和一个配置类

@Configuration
@Import(AppEntityConfiguration.class)
@ComponentScan(basePackages = "com.app.dao")
public class RepositoryContextConfiguration {
}
我在app-Entity.jar中使用@Entity注释定义了一个TableOneEntity,这很好

我有一个TableOneDao和TableOneDaoImpl,它们是用一个非常基本的函数列表定义的

public interface TableOneDao
{     ... list of functions  }

@Repositories("tableOneDao")
public class TableOneDaoImpl implements TableOneDao
{     ... iplementation of functions  }
这方面的测试非常有效:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@PropertySource(value = "file:/opt/myapp/myapp-ws.properties")
@ContextConfiguration(classes = RepositoryContextConfiguration.class)
public class OrganizationDaoTest extends BaseDaoTests
{
      @Autowired
      private TableOneDao tableOneDao;
 }
这在很大程度上是我过去做事的老方法,而且效果很好。现在,我想摆脱这种旧的做事方式,换一种新的做事方式。也许我不能在同一个项目中完成它们,这可能是问题所在

我有第二个实体(TableTwoEntity)和第二个存储库(TableTwoDao):

我得到的错误如下:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.ekotrope.dao.ClothesDryerDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657)
... 30 more
 @Configuration
 @Import(EkotropeEntityConfiguration.class)
 @ComponentScan(basePackages = "com.ekotrope.dao")
 @EnableJpaRepositories(basePackages = "com.ekotrope.dao")
 public class RepositoryContextConfiguration
 {
 }
我想我只需要修改RepositoryContextConfiguration,如下所示:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.ekotrope.dao.ClothesDryerDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657)
... 30 more
 @Configuration
 @Import(EkotropeEntityConfiguration.class)
 @ComponentScan(basePackages = "com.ekotrope.dao")
 @EnableJpaRepositories(basePackages = "com.ekotrope.dao")
 public class RepositoryContextConfiguration
 {
 }
但这并不奏效。事实上,我认为它打破了其他的工作测试。所以,问题是。。。我可以同时使用这两种方法(Dao和DaoImpl)和(jpadao)吗?或者,我应该只使用一个,如果是这样的话,我会使用JPA存储库。我只是想向不熟悉Spring的同事演示这两种方法

因此,如果我能让这两个模块同时工作,那就太好了,但如果不能,那么我可以再创建一个Maven模块,然后我将有一个myapp-dao-old.jar和myapp-dao-new.jar


谢谢你的帮助

我认为你的JPA位置配置是错误的,但你的刀是好的。 我认为这两种解决方案可以协同工作

首先,您不需要将
@Repository
放在衣物烘干机DAO界面上。(我知道您希望使用限定符,但我认为这不起作用,也不需要。(如果您没有同一个类的多个实例,则类型对于spring注入就足够了)

其次,我认为您需要更改Jpa配置。 在一个项目中,我做过类似的事情

@配置
@授权代理(
basePackageClasses=衣物烘干机DAO.class,
entityManagerFactoryRef=“configEntityManager”,
)
公共类RepositoryContextConfiguration{/
//请小心,此bean可能与sessionFactory冲突
@豆子
公共LocalContainerEntityManagerFactoryBean配置实体管理器(数据源数据源){
log.info(“启动参数Arcole实体管理器”);
LocalContainerEntityManagerFactoryBean em=新的LocalContainerEntityManagerFactoryBean();
em.setDataSource(数据源);
em.setPackagesToScan(“com.app.model”);
HibernateJavaEndorapter vendorAdapter=新的HibernateJavaEndorapter();
em.setjpavendor适配器(供应商适配器);
返回em;
}
}
第三,我认为(这一个正是我的观点)您可能不应该将经典Dao和存储库混合在同一个包中 即使用法相同