Java 运行项目时,“通过构造函数参数0表示的未满足依赖项”
运行项目时,会发生错误: UnsatifiedPendencyException:创建名为的bean时出错 在文件sqlServerQueryDaoImpl.class中定义的“sqlServerQueryDaoImpl”: 通过构造函数参数0表示的未满足依赖关系; 嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 限定“javax.persistence.EntityManagerFactory”类型的bean 可用:至少需要1个符合autowire条件的bean 候选人依赖项批注:{} 代码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个
那么发现了多个问题: 首先是。您混合了普通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>