字段需要一个无法找到的 bean 类型

所以这几周我一直在学习 Spring,一直遵循这个教程

构建 RESTful Web 服务

一切都很好,直到我尝试将它集成到 mongodb。

用 MongoDB 访问数据

但是我的实践部分仍然使用第一个,所以我的项目目录结构是这样的。

src/
├── main/
│   └── java/
|       ├── model/
|       |   └── User.java
|       ├── rest/
|       |   ├── Application.java
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── service/
|           └── UserService.java
└── resources/
└── application.properties

这是我的 Model/User.java文件

package main.java.model;


import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;


@Document(collection="user")
public class User {


private int age;
private String country;
@Id
private String id;
private String name;




public User() {
super();
}


public String getId() {
return id;
}


public void setId(String id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}


public String getCountry() {
return country;
}


public void setCountry(String country) {
this.country = country;
}
}

这是我的 Rest/UsersController.java文件

package main.java.rest;


import java.util.List;
import main.java.service.UserService;
import main.java.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping(value = "/users")
public class UsersController {


@Autowired
UserService userService;


@RequestMapping(method = RequestMethod.GET)
public List<User> getAllUsers() {
return userService.findAll();
}
}

这是我的 Service/UserService.java文件

package main.java.service;


import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;


public interface UserService extends MongoRepository<User, String> {
public List<User> findAll();
}

我可以编译它们(我使用 gradle 进行编译,因为我遵循了教程) ,但是当我运行 jar 文件时,它抛出了这个错误。


申请未能开始


描述:

Main.java.rest. UsersController 中的 Field userService 需要一个 bean 输入找不到的‘ main.java.service.UserService’。

行动:

中定义一个类型为‘ main.java.service. UserService’的 bean 你的配置。

不知道出了什么问题,我开始四处搜索,发现我需要包含 Beans.xml文件并在其中注册用户服务。我试过了,但没用。我真的是新手,所以我真的不知道这是怎么回事。

511930 次浏览

解决了。所以默认情况下,所有属于 @SpringBootApplication声明的包都将被扫描。

假设在 com.example.something中声明了具有 @SpringBootApplication声明的主类 ExampleApplication,那么所有属于 com.example.something的组件都将被扫描,而 com.example.applicant将不会被扫描。

因此,有两种方法可以做到这一点基于 有个问题。使用

@SpringBootApplication(scanBasePackages={
"com.example.something", "com.example.application"})

这样,应用程序将扫描所有指定的组件,但我认为,如果规模越来越大?

所以我使用了第二种方法,通过重组我的软件包,它起作用了!现在我的包结构变成了这样。

src/
├── main/
│   └── java/
|       ├── com.example/
|       |   └── Application.java
|       ├── com.example.model/
|       |   └── User.java
|       ├── com.example.controller/
|       |   ├── IndexController.java
|       |   └── UsersController.java
|       └── com.example.service/
|           └── UserService.java
└── resources/
└── application.properties

在 service/UserService.java 中添加 @Service

花了很多时间,因为自动导入。 Intellij 的想法某种程度上导入 @Serviceimport org.jvnet.hk2.annotations.Service;而不是 import org.springframework.stereotype.Service;

我也犯了同样的错误:

***************************
APPLICATION FAILED TO START
***************************


Description:


Field repository in com.kalsym.next.gen.campaign.controller.CampaignController required a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' that could not be found.




Action:


Consider defining a bean of type 'com.kalsym.next.gen.campaign.data.CustomerRepository' in your configuration.de here

我的软件包的构建方式与公认的答案中提到的方式相同。我通过在主类中添加 EnableMongoRepositories 注释解决了这个问题,如下所示:

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {


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

如果需要添加多项式,不要忘记使用大括号:

@EnableMongoRepositories(basePackageClasses
= {
MSASMSRepository.class, APartyMappingRepository.class
})

在控制器类中添加@Component

我有同样的问题,通过添加修复 @ EnableMongoRepositories (“ in.topthree. util”)

package in.topthree.core;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;


import in.topthree.util.Student;


@SpringBootApplication
@EnableMongoRepositories("in.topthree.util")
public class Run implements CommandLineRunner {


public static void main(String[] args) {
SpringApplication.run(Run.class, args);
System.out.println("Run");
}


@Autowired
private Process pr;


@Override
public void run(String... args) throws Exception {
pr.saveDB(new Student("Testing", "FB"));
System.exit(0);
}


}

我的仓库是:

package in.topthree.util;


import org.springframework.data.mongodb.repository.MongoRepository;


public interface StudentMongo extends MongoRepository<Student, Integer> {


public Student findByUrl(String url);
}

现在起作用了

我遇到了同样的问题,我所要做的就是将应用程序放置在一个比服务、道和域包高一级的包中。

通常我们可以从两个方面来解决这个问题:

  1. 弹簧靴扫描 豆子时,应使用适当的注释,如 @Component;
  2. 扫描中路径将包括类,就像上面提到的所有其他类一样。

顺便说一下,对于 @ Component、@Repository、@Service 和@Controller之间的差异有一个很好的解释。

用这个解决了我的问题。

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})

当两个 bean 具有相同的名称时可能会发生这种情况。

返回文章页面

@Configuration
public class Module1Beans {
@Bean
public GoogleAPI retrofitService(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.google.com/")
.addConverterFactory(JacksonConverterFactory.create())
.build();
return retrofit.create(GoogleAPI.class);
}
}

返回文章页面

@Configuration
public class Module2Beans {
@Bean
public GithubAPI retrofitService(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.github.com/")
.addConverterFactory(JacksonConverterFactory.create())
.build();
return retrofit.create(GithubAPI.class);
}
}

首先创建一个名为 retrofitService的 bean,它的类型是 GoogleAPI,然后由 GithubAPI覆盖,因为它们都是由 retrofitService()方法创建的。 现在,当你 @Autowired一个 GoogleAPI你会得到一个像 Field googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.的消息

在我的例子中,我只是将 Class MyprojectApplication 放在一个包(com.example.start)中,该包具有相同级别的模型、控制器和服务包。

这个帖子现在已经过时了,但我正在发布我的答案,这可能对其他人有用。

我也有同样的问题。 事实证明,在其他模块中还有另一个具有相同名称的类。我重命名了那个类,它解决了这个问题。

目标文件夹中的 Mapper 实现类已被删除,因此 Mapper 接口不再有实现类。因此我得到了相同的错误 Field *** required a bean of type ***Mapper that could not be found.

我只需要用 maven 重新生成我的 mappers 实现,然后刷新项目..。

我来到这个帖子寻求帮助,同时使用与 MongoRepository 的 SpringWebflux。

我的错误类似于所有者

Field usersRepository in foobar.UsersService required
a bean of type 'foobar.UsersRepository' that could not be found.

正如我以前使用 Spring MVC 一样,我对这个错误感到惊讶。

因为寻找帮助并不是那么明显,我把这个问题的答案,因为它有某种关联,这个问题是高搜索结果。

首先,您必须记住在回答中提到的标记为接受包层次结构的内容。

第二件重要的事情是,如果你使用 Webflow,你需要使用一些不同的包,而当使用 Spring MVC,例如 MongoDB 时,你需要添加

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>

最后是 有反应

使用 all@Annottions 解决了我的问题(是的,我是 Spring 的新手) 如果使用的是服务类,则添加@Service,@Controller 和@Repository 也是如此。

然后 App.java 上的这个注释解决了这个问题(我使用的是 JPA + Hibernate)

@SpringBootApplication
@EnableAutoConfiguration(exclude = { ErrorMvcAutoConfiguration.class })
@ComponentScan(basePackages = {"es.unileon.inso2"})
@EntityScan("es.unileon.inso2.model")
@EnableJpaRepositories("es.unileon.inso2.repository")

包装树:

src/
├── main/
│   └── java/
|       ├── es.unileon.inso2/
|       |   └── App.java
|       ├── es.unileon.inso2.model/
|       |   └── User.java
|       ├── es.unileon.inso2.controller/
|       |   ├── IndexController.java
|       |   └── UserController.java
|       ├── es.unileon.inso2.service/
|       |    └── UserService.java
|       └── es.unileon.inso2.repository/
|            └── UserRepository.java
└── resources/
└── application.properties

您必须将 @Service注释添加到服务的实现中。

我知道它很旧了,但是我想加上我的5分钱。

我在一个文件夹结构中使用了 .service.service.impl,以便将服务与其实现分开。忘记实现服务实现部分。

在您的道类中添加 @Repository

例如:

@Repository
public class DaoClassName implements IIntefaceDao {
}

我也有同样的问题,我的错误是在服务接口上使用了 @Service注释。 @Service注释应该应用于 ServiceImpl 类。

在 Tao 类中添加@Repository

    @Repository
public interface UserDao extends CrudRepository<User, Long> {
User findByUsername(String username);
User findByEmail(String email);
}

我遇到了同样的问题,我从控制器中删除了 @Autowired注释。如果您的存储库是一个类,那么使用存储库需要 Autowired 注释,但是当它是一个接口时,根据我的经验,您不需要添加 @Autowired注释。

你必须进口 spring-boot-starter-data-jpa 如果使用弹簧启动,则作为依赖项

为了弹出来创建 bean 并注入它类应该用 @ Component,@service or@Repository标记它的任何一个,在您的上下文中它应该是

package main.java.service;


import java.util.List;
import main.java.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;
@Repository
public interface UserService extends MongoRepository<User, String> {
public List<User> findAll();
}

对我来说,这个信息是:

org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public org.package.MyClass(org.apache.wicket.request.mapper.parameter.PageParameters)' and argument ''. Might be it doesn't exist, may be it is not visible (public).

意思是“在顶部的 wicket 单元测试中,你必须手动将 bean 添加到 like 中”

appContext.putBean(myClass);

在这里,我遵循 OP 所遵循的所有步骤和指令,处理用户名和密码周围的空白(尽管 spring 处理属性文件中的空白) ,仍然是面向

could not find bean for ___Repository

(您的接口扩展了 JPARepository)

在添加@EnableJPARepository 之后的 OR

could not find bean for EntityManagerFactory

我通过在 pom.xml 中将 spring boot starter 父版本从2.3.2更改为2.2.1来解决这个问题

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>

并添加以下依赖项

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

我不需要添加任何以下,弹簧启动做它自己

  1. @ EnableJPAReposity-因为我已经有了所有具有相同根包的类
  2. 在 application.properties 中启用了 spring.data.jpa.Repositories.
  3. DriverClassName = com.mysql.jdbc. Driver in application properties 应用程序属性中的驱动程序

对于那些通过谷歌搜索通用 bean 错误消息而被带到这里的人来说,但是如果他们实际上试图通过客户端界面上的 @FeignClient注释将 < strong > 冒牌客户 添加到他们的 Spring Boot 应用程序中,那么以上所有的解决方案都不适合你。

要解决这个问题,您需要将 @EnableFeignClients注释添加到 Application 类中,如下所示:

@SpringBootApplication
// ... (other pre-existing annotations) ...
@EnableFeignClients // <------- THE IMPORTANT ONE
public class Application {

通过这种方式,修复程序类似于上面提到的 @EnableMongoRepositories修复程序。遗憾的是,这个通用错误消息需要针对每种类型的情况进行定制的修复..。

两种类型的 mongo 依赖项-

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

两种类型的存储库-

MongoRepository
ReactiveMongoRepository

确保您使用的是正确的组合。

在定义服务类时,可以添加 @Service

例如:

@Service
public class myService {


public String getData(){
return "some data";
}


}

@SpringBootApplication注释的类应该在 你的根包中(默认情况下是 package and subpackages are scanned中的所有类) ,或者您需要在@Component Scan 中指定其他包(控制器、实体和其他包)。

为了在 Spring 框架中创建 bean 并注入类,需要在类级别中相应地用 @ Component,@Service or@Repository标记 Class。确保你已经用过了。

enter image description here

将这个值放入 application.properties对我来说很有用

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

请注意,如果您的包结构与接受的答案中的结构相同,那么您所需要的只是主类上的 @SpringBootApplication注释(其中没有额外的参数)

来源: SpringbootField 需要一个无法找到的 bean 类型

花了大约2个小时调试这个错误,然后在某种程度上弄明白了我忘记添加 SpringWebMvcDependency

   <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>

您需要向主类中添加一个 @ComponentScan注释,告诉它扫描服务包,否则它将不会初始化这些 bean

对于我来说,添加依赖项‘ org.monGodb: mongodb-drive-sync: 4.3.2’非常有效。 在这里没找到答案。

只有当你尝试自动连接一个抽象类时才有趣!

由于 SpringBoot 在默认情况下无法找到抽象类,所以您遇到了这个问题。

首先,抽象类不是组件扫描的,因为没有具体的子类它就不能被实例化。

意味着您必须为这个抽象类创建一个子类来解决这个问题。

我好几个小时都在想这个问题。原因就是这个排除命令。我之前为了测试而添加了这个(后来忘记了)。我相信有人也会犯同样的错误。

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })

... 需要修正的改变:

@SpringBootApplication

在科特林初始化格拉德勒项目时也面临同样的问题。

原因: 实际上它无法扫描 build.gradle.kts 文件。

解决方案: 我们可以在主函数声明之前添加一个 @ComponentScan("build.gradle.kts"),这样它就可以转到 gradle 文件并扫描所有需要的依赖项。