我正在开发一个弹簧启动应用程序,我在这里遇到了一个问题。我正在尝试注入 @Repository 带注释的接口,但它似乎根本不起作用。我收到此错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springBootRunner': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.pharmacy.config.SpringBootRunner.main(SpringBootRunner.java:25)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.pharmacy.persistence.users.dao.UserEntityDao com.pharmacy.config.SpringBootRunner.userEntityDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 16 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.pharmacy.persistence.users.dao.UserEntityDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 18 common frames omitted
这是我的代码:
主要应用类:
package com.pharmacy.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("org.pharmacy")
public class SpringBootRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootRunner.class, args);
}
}
实体类:
package com.pharmacy.persistence.users;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class UserEntity {
@Id
@GeneratedValue
private Long id;
@Column
private String name;
}
仓库界面:
package com.pharmacy.persistence.users.dao;
import com.pharmacy.persistence.users.UserEntity;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserEntityDao extends CrudRepository<UserEntity,Long>{
}
控制器:
package com.pharmacy.controllers;
import com.pharmacy.persistence.users.UserEntity;
import com.pharmacy.persistence.users.dao.UserEntityDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@Autowired
UserEntityDao userEntityDao;
@RequestMapping(value = "/")
public String hello() {
userEntityDao.save(new UserEntity("ac"));
return "Test";
}
}
构建.gradle
buildscript {
ext {
springBootVersion = '1.2.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
mainClassName = "com.pharmacy.config.SpringBootRunner"
jar {
baseName = 'demo'
version = '0.0.1-SNAPSHOT'
}
repositories {
mavenCentral()
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-ws")
compile("postgresql:postgresql:9.0-801.jdbc4")
testCompile("org.springframework.boot:spring-boot-starter-test")
}
应用程序属性:
spring.view.prefix: /
spring.view.suffix: .html
spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=abc123
我什至将我的代码与 Accessing data jpa 进行了比较,我想不出这段代码有什么问题。任何帮助表示赞赏。提前致谢。
编辑:我按照上面的建议更改了我的代码,当我将@Repository 接口注入另一个组件时,我没有收到该错误。但是,我现在有一个问题 - 我的组件无法检索(我使用了调试)。我做错了什么,所以 spring 找不到我的组件?
当存储库包与 @SpringBootApplication
/@EnableAutoConfiguration
不同时,需要显式定义 @EnableJpaRepositories
的基本包。
尝试将 @EnableJpaRepositories("com.pharmacy.persistence.users.dao")
添加到 SpringBootRunner
我在找不到存储库时遇到了同样的问题。所以我所做的就是把所有东西都放进一个包里。这意味着我的代码没有任何问题。我将 Repos & Entities 移动到另一个包中,并将以下内容添加到 SpringApplication 类中。
@EnableJpaRepositories("com...jpa")
@EntityScan("com...jpa")
之后,我将服务(接口和实现)移到另一个包中,并将以下内容添加到 SpringApplication 类中。
@ComponentScan("com...service")
这解决了我的问题。
@EnableJpaRepositories
后给出 not mapped type
错误
我想分享这类问题的另一个原因,因为我在这个问题上挣扎了一段时间,但在 SO 上找不到任何答案。
在像这样的存储库中:
@Repository
public interface UserEntityDao extends CrudRepository<UserEntity, Long>{
}
如果您的实体 UserEntity
没有类上的 @Entity
注释,您将遇到相同的错误。
对于这种情况,此错误令人困惑,因为您专注于尝试解决有关 Spring 未找到存储库但问题是实体的问题。如果您在尝试测试您的存储库时得到这个答案,this answer 可能会对您有所帮助。
您的 @ComponentScan
注释似乎设置不正确。尝试 :
@ComponentScan(basePackages = {"com.pharmacy"})
实际上,如果您的主类位于结构的顶部,例如直接在 com.pharmacy
包下,则不需要组件扫描。
另外,你不需要两者
@SpringBootApplication
@EnableAutoConfiguration
默认情况下,@SpringBootApplication
注释包括 @EnableAutoConfiguration
。
@ComponentScan("com.pharmacy")
应该这样做。
我有一个类似的问题,我在 Spring Boot 中收到 NoSuchBeanDefinitionException
(基本上是在处理 CRUD 存储库时),我必须在主类上放置以下注释:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages={"<base package name>"})
@EnableJpaRepositories(basePackages="<repository package name>")
@EnableTransactionManagement
@EntityScan(basePackages="<entity package name>")
此外,请确保您在实施中具有 @Component
注释。
在 SpringBoot 中,JpaRepository 默认不自动启用。您必须明确添加
@EnableJpaRepositories("packages")
@EntityScan("packages")
@EnableJpaRepositories
和 @EntityScan
之后,我可以使用我的库项目来连接数据库
@SpringBootApplication(scanBasePackages=,<youur package name>)
@EnableJpaRepositories(<you jpa repo package>)
@EntityScan(<your entity package>)
Entity class like below
@Entity
@Table(name="USER")
public class User {
@Id
@GeneratedValue
要扩展到上述答案,您实际上可以在 EnableJPARepositories 标记中添加多个包,这样您就不会在仅指定存储库包后遇到“对象未映射”错误。
@SpringBootApplication
@EnableJpaRepositories(basePackages = {"com.test.model", "com.test.repository"})
public class SpringBootApplication{
}
这是错误:正如有人之前所说,您在 componentsscan 中使用了 com.pharmacy 的 org.pharmacy insted
package **com**.pharmacy.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("**org**.pharmacy")
public class SpringBootRunner {
您正在扫描错误的包裹:
@ComponentScan("**org**.pharmacy")
它应该在哪里:
@ComponentScan("**com**.pharmacy")
由于您的包名称以 com 而不是 org 开头。
我对这个话题也有一些问题。您必须确保在 Spring boot runner 类中定义包,如下例所示:
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
我希望这有帮助!
这可能与您的包裹有关。我遇到了类似的问题:
Description:
Field userRepo in com.App.AppApplication required a bean of type 'repository.UserRepository' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
行动:
考虑在您的配置中定义类型为“repository.UserRepository
”的 bean。 "
通过将存储库文件放入具有标准化命名约定的包中来解决它:
e.g. com.app.Todo (for main domain files)
和
com.app.Todo.repository (for repository files)
这样一来,spring 就知道去哪里寻找存储库,否则事情会很快变得混乱。 :)
希望这可以帮助。
我在使用 Spring Data MongoDB 时遇到了类似的问题:我必须将包路径添加到 @EnableMongoRepositories
我遇到了类似的问题,但原因不同:
就我而言,问题是在定义存储库的界面中
public interface ItemRepository extends Repository {..}
我省略了模板的类型。正确设置它们:
public interface ItemRepository extends Repository<Item,Long> {..}
成功了。
在 @ComponentScan("org.pharmacy")
中,您声明了 org.pharmacy
包。但是您的组件在 com.pharmacy
包中。
如果您在使用 @DataJpaTest
进行单元测试时遇到此问题,那么您将在下面找到解决方案。
Spring Boot 不为 @DataJpaTest
初始化 @Repository
bean。因此,请尝试以下两个修复之一以使它们可用:
第一的
请改用 @SpringBootTest
。但这将启动整个应用程序上下文。
第二(更好的解决方案)
导入您需要的特定存储库,如下所示
@DataJpaTest
@Import(MyRepository.class)
public class MyRepositoryTest {
@Autowired
private MyRepository myRepository;
我通过更改该依赖项解决了该问题:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
有了那个:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
这样就不需要使用注释,例如:
@EnableAutoConfiguration
@ComponentScan({"controller", "service"})
@EntityScan("entity")
@EnableJpaRepositories("repository")
)
确保尝试自动连接存储库的 @Service
或 @Component
与您的 SpringApplication.class
不在同一目录中。确保它位于 service/
之类的子文件夹中。
当我忘记将 Lombok 注释处理器依赖项添加到 maven 配置时,有时我会遇到同样的问题
添加以下对 pom.xml 的依赖解决了问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
如果您的主类在 com.example 包中,则应在 com.example 包中调用位于不同包中的其他类;即:控制器包com.example.controller
和
如果您将主类包作为 com.example.main 提供,则您的 Main 类应该在 com.example 中而不是在 com.example.main 中,那么另一个应该在该包中,例如 com.package.main.controller
@SpringBootApplication
位于包com.pharmacy.config
,而@EnableJpaRepositories
位于com.pharmacy.persistence.users.dao
Entity is not a managed type
。对于遇到此问题的其他人,您还需要添加注释@EntityScan("com.package.dtos")
@EnableMongoRepositories("...")