“字段需要找不到类型的bean。” 使用mongodb的错误Spring Restful API


101

所以我在接下来的几周里一直在学习Spring,一直在关注本教程

构建RESTful Web服务

在我尝试将其集成到mongodb之前,一切都很好。所以我按照本教程。

使用MongoDB访问数据

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

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

这是我的模型/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中的userService字段需要一个类型为'main.java.service.UserService'的Bean。

行动:

考虑在配置中定义类型为“ main.java.service.UserService”的bean。

不确定出什么问题后,我开始四处搜寻,发现需要包含Beans.xml文件并在其中注册userService。我做到了,但是没有用。我真的很陌生,所以我对发生的事情一无所知。

Answers:


159

解决了。因此,默认情况下,@SpringBootApplication将扫描所有属于声明范围的软件包。

假设我的ExampleApplication具有@SpringBootApplication声明的主类在内部声明com.example.something,那么所有属于该类的组件都将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

实际上并没有多大变化,我只是对软件包和类进行了一些重命名@GuoJing
Eka Rudianto '17

@ekaRudianto有一个错字。没有开放{scanBasePackages= "com.example.something","com.example.application"
BRK

我也遇到了同样的问题,并发现我的程序包结构不正确。我像这样重新排列了它们,现在一切正常。
Vimukthi Sineth '19

73

@Service在service / UserService.java中添加。


20

我也有同样的错误:

***************************
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
    })


12

该线程现在已经很旧了,但是我正在发布我的答案,这可能对其他人有用。

我遇到过同样的问题。原来,在其他模块中还有另一个具有相同名称的类。我重命名了该类,它解决了这个问题。


10

由于自动导入而花费了很多时间。为什么@Service从Intellij Idea导入import org.jvnet.hk2.annotations.Service;而不是import org.springframework.stereotype.Service;


您能否更新答案并解释自己在做什么。预先感谢
MZaragoza '17

3
您从我的答案中不了解什么?尝试运行项目时遇到了与该问题相同的错误。这是因为我Service从错误的库中导入了。
维塔利·库兹明

@VitaliKuzmin您的回答仍然不清楚。您的答案可能是正确的,可能对您
有用,

3
@mannedear我想我的第一条评论也会回答您的评论。
Vitali Kuzmin

+1了这个答案,因为我也出现了导入错误!:0, import javax.persistence.Table;而不是import org.springframework.data.relational.core.mapping.Table;在我的模型中。smh在调试此bean错误时丢失了5小时。
kalpaj agrawalla




3

在您的dao类中添加@Repository

例:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

使用所有@注释解决了我的问题。(是的,我是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

2

我有同样的问题,可以通过添加 @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

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

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


1

我来到这篇文章时,在将Spring Webflux与Mongo Repository结合使用时寻求帮助。

我的错误类似于拥有者

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

在使用Spring MVC之前,我为这个错误感到惊讶。

因为寻求帮助并不那么明显,所以我正在回答这个问题,因为它以某种方式相关并且这个问题在搜索结果中很高。

首先,您必须记住答案中标记为已接受的内容-包层次结构。

第二个重要的事情是,如果您使用Webflux,则需要使用一些其他软件包,而在使用Spring MVC时(例如对于MongoDB)则需要添加

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

最后带有-reactive



1

在dao类中添加@Repository

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

如果您已经扩展了CrudRepository,则无需添加@Repository
Karen Goh,

1

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


0

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

Module1Beans.java

@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);
    }
}

Module2Beans.java

@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.


0

就我而言,我只是将MyprojectApplication类放入具有相同级别的模型,控制器,服务包的包(com.example.start)中。


0

我知道它很旧,但想加5美分。

我使用.service.service.impl在文件夹结构中将服务与其实现分开。忘记实现ServiceImplementation了。


0

如果您使用spring boot,则必须作为依赖项导入spring-boot-starter-data-jpa


0

为了弹簧创建bean并注入它,应该根据您上下文中的上下文用@ Componet,@ service,@ 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();
}

0

对我来说,这则讯息是:

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).

表示“在我的小门单元测试的顶部,您必须像这样手动添加该bean”

appContext.putBean(myClass);

0

我按照这里的OP的所有步骤和说明进行操作,照顾了用户名和密码周围的空格(即使spring照顾了属性文件中的空格),仍然面对

could not find bean for ___Repository

(您的接口扩展了JPARepository)

或者添加@EnableJPARepository后

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>

我不需要添加以下任何内容,spring boot会自己完成

  1. @EnableJPAReposity-因为我已经用相同的根包安装了所有类
  2. 在application.properties中启用了spring.data.jpa.repositories。
  3. 应用程序属性中的spring.datasource.driverClassName = com.mysql.jdbc.Driver

0

对于谁是带到这里通过谷歌搜索通用豆错误信息任何人,但谁是真正的尝试将添加假死客户通过他们的春季启动应用程序@FeignClient客户端界面注释端的任何人,上述解决方案都不适合您。

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

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

这样,该修复程序类似于上述@EnableMongoRepositories修复程序。可惜的是,这种通用错误消息需要针对每种情况进行如此量身定制的修复...


0

两种类型的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

确保使用正确的组合。


-1

使用此解决了我的问题。

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.