Java 运行项目时,“通过构造函数参数0表示的未满足依赖项”

Java 运行项目时,“通过构造函数参数0表示的未满足依赖项”,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,运行项目时,会发生错误: UnsatifiedPendencyException:创建名为的bean时出错 在文件sqlServerQueryDaoImpl.class中定义的“sqlServerQueryDaoImpl”: 通过构造函数参数0表示的未满足依赖关系; 嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 限定“javax.persistence.EntityManagerFactory”类型的bean 可用:至少需要1个

运行项目时,会发生错误:

UnsatifiedPendencyException:创建名为的bean时出错 在文件sqlServerQueryDaoImpl.class中定义的“sqlServerQueryDaoImpl”: 通过构造函数参数0表示的未满足依赖关系; 嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 限定“javax.persistence.EntityManagerFactory”类型的bean 可用:至少需要1个符合autowire条件的bean 候选人依赖项批注:{}

代码


那么发现了多个问题:

首先是。您混合了普通Spring和Spring引导应用程序/配置

例如,此依赖项:

   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
然后,出现了两个数据源的问题

PostgresqlConfiguration

改变

public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(postgresqlDataSource())
                .properties(hibernateProperties())
                .packages("com.server.entity.postgresql")
                .persistenceUnit("postgresqlPU")
                .build();

类似地,对SqlserverConfiguration.java类执行相同的操作

在SqlServerQueryDaoImpl.java中,执行以下更改:

@PersistenceContext(unitName="sqlserverPU")
private EntityManager sqlserverEntityManager;

public SqlServerQueryDaoImpl(@Qualifier("sqlserverEntityManager")EntityManagerFactory sqlserverEntityManager) {
    this.sqlserverEntityManager = sqlserverEntityManager.createEntityManager();
    session = sqlserverEntityManager.createEntityManager().unwrap(Session.class);
}
要禁用数据源HikariCP将扫描的Spring自动配置,请将以下内容添加到application.properties:

不需要其他更改

那么您的实体中的@Cache就有问题了。您没有指定,也没有将缓存提供程序添加到类路径,因此它找不到提供程序,并且在启动时失败。只需从DayVisits.java和IntervalVisits.java中删除@Cache注释

然后将@Transient添加到此setter:

@Transient
public List<IntervalVisits> getIntervalVisits() {
    return intervalVisits;
}
最后,您需要将JSONB bean实现添加到类路径:

      <dependency>
          <groupId>javax.json.bind</groupId>
          <artifactId>javax.json.bind-api</artifactId>
          <version>1.0</version>
      </dependency>
      <dependency>
          <groupId>org.eclipse</groupId>
          <artifactId>yasson</artifactId>
          <version>1.0</version>
      </dependency>
      <dependency>
          <groupId>org.glassfish</groupId>
          <artifactId>javax.json</artifactId>
          <version>1.1</version>
      </dependency>
在所有这些更改完成后,我能够在嵌入式Tomcat上启动应用程序

我还建议删除所有*.xml配置文件。将所有内容移动到application.properties并从那里读取

一般来说,尽量减少Spring应用程序的定制,除非你完全理解自己在做什么。SpringBoot提供了大量的方法,可以用最少的努力引导您的项目。例如,本文展示了一个具有2个数据源的Spring Boot应用程序示例:

总的来说,为了让项目运行,确实需要一些适度的重构


祝您好运。

请分享您的构建配置pom.xml或build.gradledone,请帮助我。我不明白为什么在EntityManagerFactory字段的顶部将@PersistentContext更改为@PersistenceUnit我试过了它没有帮助这是公开的代码吗?其他地方可能有问题。谢谢!你帮了我这么多。谢谢你的时间!
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
<dependency>
  <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
</dependency>
package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainClass {

    public static void main(String[] args) {
        SpringApplication.run(MainClass.class, args);
    }

}
public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(postgresqlDataSource())
                .properties(hibernateProperties())
                .packages("com.server.entity.postgresql")
                .persistenceUnit("postgresqlPU")
                .build();
@Bean(name = "postgresqlEntityManager")
    public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();

        factoryBean.setDataSource(postgresqlDataSource());
        factoryBean.setJpaPropertyMap(hibernateProperties());
        factoryBean.setPackagesToScan("com.server.entity.postgresql");
        factoryBean.setPersistenceUnitName("postgresqlPU");

        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQL95Dialect");

        factoryBean.setJpaVendorAdapter(jpaVendorAdapter);

        return factoryBean;
    }
@PersistenceContext(unitName="sqlserverPU")
private EntityManager sqlserverEntityManager;

public SqlServerQueryDaoImpl(@Qualifier("sqlserverEntityManager")EntityManagerFactory sqlserverEntityManager) {
    this.sqlserverEntityManager = sqlserverEntityManager.createEntityManager();
    session = sqlserverEntityManager.createEntityManager().unwrap(Session.class);
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
@Transient
public List<IntervalVisits> getIntervalVisits() {
    return intervalVisits;
}
public void setWeek_num(int week_num) {
    this.week_num = week_num;
}
      <dependency>
          <groupId>javax.json.bind</groupId>
          <artifactId>javax.json.bind-api</artifactId>
          <version>1.0</version>
      </dependency>
      <dependency>
          <groupId>org.eclipse</groupId>
          <artifactId>yasson</artifactId>
          <version>1.0</version>
      </dependency>
      <dependency>
          <groupId>org.glassfish</groupId>
          <artifactId>javax.json</artifactId>
          <version>1.1</version>
      </dependency>