'Trường yêu cầu một loại bean không thể tìm thấy.' error Spring Restful API sử dụng mongodb


101

Vì vậy, tôi đã học Mùa xuân trong các cặp đôi trong tuần, theo hướng dẫn này

Xây dựng một dịch vụ web RESTful

Tất cả đều tốt cho đến khi tôi cố gắng tích hợp nó vào mongodb. Vì vậy, tôi làm theo hướng dẫn này.

Truy cập dữ liệu với MongoDB

Nhưng thực tế của tôi một phần vẫn là sử dụng cái đầu tiên. Vì vậy, cấu trúc thư mục dự án của tôi là như thế này.

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

Đây là mô hình / tệp User.java của tôi

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

Đây là tệp còn lại / UsersController.java của tôi

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

Đây là dịch vụ / tệp UserService.java của tôi

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

Tôi có thể biên dịch chúng (tôi đang sử dụng gradle để biên dịch vì tôi đang làm theo hướng dẫn), nhưng khi tôi chạy tệp jar, nó đã gặp lỗi này.


KHÔNG BẮT ĐẦU ỨNG TUYỂN


Sự miêu tả:

Trường userService trong main.java.rest.UsersController yêu cầu một bean kiểu 'main.java.service.UserService' không thể tìm thấy.

Hoạt động:

Xem xét việc xác định bean kiểu 'main.java.service.UserService' trong cấu hình của bạn.

Không chắc chắn điều gì sai, tôi bắt đầu tìm kiếm xung quanh và thấy rằng tôi cần phải bao gồm Beans.xmltệp và đăng ký userService trong đó. Tôi đã làm điều đó nhưng nó không hoạt động. Tôi thực sự mới làm quen với điều này nên tôi thực sự không có manh mối về những gì đang xảy ra.

Câu trả lời:


159

Đã giải quyết nó. Vì vậy, theo mặc định, tất cả các gói được @SpringBootApplicationkhai báo sẽ được quét.

Giả sử lớp chính của tôi ExampleApplication@SpringBootApplicationkhai báo được khai báo bên trong com.example.something, thì tất cả các thành phần nằm dưới com.example.somethingđược quét trong khi com.example.applicantsẽ không được quét.

Vì vậy, có hai cách để làm điều đó dựa trên câu hỏi này . Sử dụng

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

Bằng cách đó, ứng dụng sẽ quét tất cả các thành phần được chỉ định, nhưng tôi nghĩ điều gì sẽ xảy ra nếu quy mô ngày càng lớn hơn?

Vì vậy, tôi sử dụng cách tiếp cận thứ hai, bằng cách cơ cấu lại các gói của tôi và nó đã hoạt động! Bây giờ cấu trúc các gói của tôi trở thành như thế này.

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

không có gì nhiều thay đổi thực sự, tôi chỉ làm một số đổi tên của các gói và các lớp @GuoJing
Eka Rudianto

@ekaRudianto Có lỗi đánh máy. Không mở cửa {choscanBasePackages= "com.example.something","com.example.application"
brk

Tôi cũng gặp vấn đề tương tự và phát hiện ra rằng cấu trúc gói của tôi không đúng thứ tự. Tôi đã sắp xếp lại chúng như thế này và hiện tại nó đang hoạt động tốt.
Vimukthi Sineth


20

Tôi cũng gặp lỗi tương tự:

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

Và các gói của tôi được xây dựng theo cùng một cách như đã đề cập trong câu trả lời được chấp nhận. Tôi đã khắc phục sự cố của mình bằng cách thêm chú thích EnableMongoRepositories trong lớp chính như sau:

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

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

Nếu bạn cần thêm nhiều, đừng quên dấu ngoặc nhọn:

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

14

Tôi gặp phải vấn đề tương tự và tất cả những gì tôi phải làm là đặt Ứng dụng trong gói cao hơn một cấp so với gói dịch vụ, dao và miền.


12

Chủ đề này hiện đã cũ nhưng tôi đang đăng câu trả lời của mình, có thể hữu ích cho những người khác.

Tôi gặp vấn đề tương tự. Hóa ra là có một lớp khác có cùng tên trong mô-đun khác. Tôi đã đổi tên lớp đó và nó đã giải quyết được vấn đề.


10

Đã tốn rất nhiều thời gian vì tự động nhập. Intellij Idea tại sao lại được nhập @Servicetừ import org.jvnet.hk2.annotations.Service;thay vì import org.springframework.stereotype.Service;!


Bạn có thể cập nhật câu trả lời của mình và giải thích những gì bạn đang làm. Nhiều cảm ơn trước
MZaragoza

3
Bạn không hiểu gì từ câu trả lời của tôi? Tôi đã gặp lỗi tương tự như trong câu hỏi, khi cố gắng chạy dự án. Đó là bởi vì tôi đã nhập Servicetừ thư viện sai.
Vitali Kuzmin

@VitaliKuzmin vẫn không có sự rõ ràng trong câu trả lời của bạn. Câu trả lời của bạn có thể đúng và nó có thể làm việc cho bạn, nhưng theo cách bạn trình bày ở đây là khó hiểu và không đọc thân thiện
mannedear

3
@mannedear Tôi nghĩ rằng bình luận đầu tiên của tôi cũng trả lời bình luận của bạn.
Vitali Kuzmin

+1 câu trả lời này, vì tôi cũng mắc lỗi nhập! : 0 import javax.persistence.Table;thay vì import org.springframework.data.relational.core.mapping.Table;trong mô hình của tôi. smh mất 5 giờ khi gỡ lỗi bean này.
kalpaj agrawalla

8

Bạn phải thêm @Servicechú thích vào việc triển khai dịch vụ của mình.


5

Thêm @Component vào lớp bộ điều khiển của bạn. Có thể công việc này


5

Thông thường chúng ta có thể giải quyết vấn đề này theo hai khía cạnh:

  1. chú thích thích hợp sẽ được sử dụng để Spring Boot quét bean , như @Component;
  2. các chức năng quét đường dẫn sẽ bao gồm các lớp học cũng giống như tất cả những người khác nêu trên.

Nhân tiện, có một lời giải thích rất tốt cho sự khác biệt giữa @Component, @Repository, @Service và @Controller .


3

Thêm @Repository trong lớp dao của bạn

thí dụ:

@Repository
public class DaoClassName implements IIntefaceDao {
}

2

Sử dụng tất cả các Chú thích @ đã khắc phục sự cố của tôi. (Có, tôi mới sử dụng Spring) Nếu bạn đang sử dụng một lớp dịch vụ, hãy thêm @Service và tương tự cho @Controller và @Repository.

Sau đó, chú thích này trên App.java đã khắc phục sự cố (Tôi đang sử dụng JPA + Hibernate)

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

Cây gói:

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

Tôi gặp sự cố tương tự, đã được khắc phục bằng cách Thêm @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);
    }

}

Và Kho lưu trữ của tôi là:

package in.topthree.util;

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

public interface StudentMongo extends MongoRepository<Student, Integer> {

    public Student findByUrl(String url);
}

Hiện nó đang hoạt động


1

Các lớp triển khai Mapper trong thư mục đích của tôi đã bị xóa, vì vậy các giao diện Mapper của tôi không còn các lớp triển khai nữa. Vì vậy, tôi gặp cùng một lỗiField *** required a bean of type ***Mapper that could not be found.

Tôi chỉ cần tạo lại các triển khai trình lập bản đồ của mình với maven và làm mới dự án ...


1

Tôi đã đến bài đăng này để tìm kiếm trợ giúp khi sử dụng Spring Webflux với Kho lưu trữ Mongo.

Lỗi của tôi tương tự với chủ sở hữu

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

Khi tôi làm việc trước đây với Spring MVC, tôi đã rất ngạc nhiên vì lỗi này.

Bởi vì việc tìm kiếm sự trợ giúp không quá rõ ràng, tôi đang đặt câu trả lời cho câu hỏi này vì nó có liên quan bằng cách nào đó và câu hỏi này có tỷ lệ cao trong kết quả tìm kiếm.

Điều đầu tiên là bạn phải nhớ về những gì đã được đề cập trong câu trả lời được đánh dấu là được chấp nhận - hệ thống phân cấp gói.

Điều quan trọng thứ hai là nếu bạn sử dụng Webflux, bạn cần sử dụng một số gói khác nhau trong khi khi sử dụng Spring MVC, ví dụ: cho MongoDB, bạn cần thêm

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

với -reactive ở cuối.


1

Tôi gặp vấn đề tương tự. Sai lầm của tôi là tôi đã sử dụng chú thích @Service trên Giao diện dịch vụ. Chú thích @Service nên được áp dụng cho lớp ServiceImpl.


1

Thêm @Repository vào lớp dao của bạn

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

Không cần thêm @Repository nếu bạn đã mở rộng CrudRepository
Karen Goh

1

Tôi gặp sự cố tương tự, tôi đã xóa Chú thích @Autow mong muốn khỏi bộ điều khiển. Nếu kho lưu trữ của bạn là một lớp thì Chú thích tự động là cần thiết để sử dụng kho lưu trữ nhưng khi nó là một giao diện, bạn không cần thêm Chú thích @ Không mong muốn theo kinh nghiệm của tôi.


0

Điều này có thể xảy ra khi hai hạt đậu có cùng tên.

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

Một hạt đậu có tên retrofitServiceđược tạo ra đầu tiên, và loại của nó GoogleAPI, sau đó được bao phủ bởi một lớp vỏ bởi GithubAPIvì cả hai đều được tạo ra bởi một retrofitService()phương pháp. Bây giờ khi bạn @AutowiredGoogleAPIbạn, bạn sẽ nhận được một thông báo nhưField googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

Trong trường hợp của tôi, tôi vừa đặt Class MyprojectApplication trong một gói (com.example.start) với cùng mức mô hình, bộ điều khiển, gói dịch vụ.


0

Tôi biết nó đã cũ, nhưng tôi muốn thêm 5 xu của mình.

Tôi đã sử dụng .service.service.impltrong một cấu trúc thư mục để phân tách dịch vụ với việc triển khai nó. Quên triển khai phần ServiceImplementation.


0

bạn phải nhập spring-boot-starter-data-jpa dưới dạng phụ thuộc nếu bạn sử dụng spring boot


0

Để mùa xuân tạo bean và chèn lớp nó nên được đánh dấu bằng @ Componet, @ service, @ Repository, v.v. tùy theo ngữ cảnh trong ngữ cảnh của bạn, nó nên được

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

Đối với tôi tin nhắn này:

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

có nghĩa là "trong bài kiểm tra đơn vị wicket của tôi ở trên cùng, bạn phải thêm hạt đậu đó vào như thủ công"

appContext.putBean(myClass);

0

Tôi đã làm theo tất cả các bước và hướng dẫn tiếp theo là OP ở đây, chăm sóc khoảng trống xung quanh tên người dùng và mật khẩu (mặc dù mùa xuân chăm sóc khoảng trắng trong tệp thuộc tính), vẫn phải đối mặt

could not find bean for ___Repository

(bạn giao diện mở rộng JPARepository)

HOẶC sau khi thêm @EnableJPARepository

could not find bean for EntityManagerFactory

tôi đã giải quyết nó bằng cách thay đổi phiên bản gốc khởi động mùa xuân từ 2.3.2 sang 2.2.1 trong pom.xml

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

và thêm phần phụ thuộc sau

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

Tôi không cần thêm bất kỳ điều nào sau đây, khởi động mùa xuân tự nó

  1. @EnableJPAReposity - vì tôi đã có tất cả các lớp với cùng một gói gốc
  2. spring.data.jpa.repositories.enabled trong application.properties
  3. spring.datasource.driverClassName = com.mysql.jdbc.Driver trong thuộc tính ứng dụng

0

Đối với bất kỳ ai được đưa đến đây bằng cách googling thông báo lỗi bean chung, nhưng người thực sự đang cố gắng thêm một ứng dụng giả vào ứng dụng Spring Boot của họ thông qua@FeignClient chú thích trên giao diện khách hàng của bạn, không có giải pháp nào ở trên sẽ phù hợp với bạn.

Để khắc phục sự cố, bạn cần thêm @EnableFeignClientschú thích vào lớp Ứng dụng của mình, như sau:

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

Với cách này, cách khắc phục tương tự như cách @EnableMongoRepositorieskhắc phục đã nêu ở trên. Thật tiếc khi thông báo lỗi chung này yêu cầu một bản sửa lỗi phù hợp như vậy cho mọi loại trường hợp ...


0

Hai loại phụ thuộc 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> 

Hai loại kho lưu trữ -

MongoRepository
ReactiveMongoRepository

Đảm bảo rằng bạn đang sử dụng kết hợp phù hợp.


-1

Sử dụng điều này đã giải quyết được vấn đề của tôi.

@SpringBootApplication(scanBasePackages={"com.example.something", "com.example.application"})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.