'필드를 찾을 수없는 유형의 빈이 필요합니다.' mongodb를 사용하는 오류 스프링 편안한 API


104

그래서 저는 몇 주 동안 Spring을 배우고 있었고,이 튜토리얼을 따랐습니다.

RESTful 웹 서비스 구축

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를 등록 해야한다는 것을 알았 습니다. 내가했지만 작동하지 않습니다. 나는 이것에 정말 익숙해 져서 무슨 일이 일어나고 있는지 전혀 모른다.

답변:


163

해결했습니다. 따라서 기본적으로 @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 한
에카 Rudianto

@ekaRudianto 오타가 있습니다. 어떤 개방하지 {에 대한scanBasePackages= "com.example.something","com.example.application"
BRK

나는 또한 같은 문제가 있었고 내 패키지 구조가 올바른 순서가 아니라는 것을 알았습니다. 나는 이것을 이렇게 재배치했고 지금은 잘 작동합니다.
Vimukthi Sineth 2010 년

76

@Serviceservice / UserService.java에를 추가하십시오 .


21

나는 또한 같은 오류가 있었다.

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

14

동일한 문제가 발생하여 서비스, dao 및 도메인 패키지보다 한 수준 높은 패키지에 응용 프로그램을 배치하기 만하면되었습니다.


12

이 스레드는 현재 오래되었지만 다른 사람들에게 유용 할 수있는 내 답변을 게시하고 있습니다.

나는 같은 문제가 있었다. 다른 모듈에 같은 이름을 가진 다른 클래스가 있음이 밝혀졌습니다. 나는 그 수업의 이름을 바꾸고 문제를 해결했습니다.


10

자동 가져 오기 때문에 많은 시간을 보냈습니다. 인 IntelliJ 아이디어는 somewhy 수입 @Service에서 import org.jvnet.hk2.annotations.Service;대신 import org.springframework.stereotype.Service;!


답변을 업데이트하고 무엇을하고 있는지 설명해 주시겠습니까? 사전에 많은 감사
MZaragoza

3
내 대답에서 이해하지 못한 것은 무엇입니까? 프로젝트를 실행하려고 할 때 질문과 동일한 오류가 발생했습니다. Service잘못된 라이브러리에서 가져 왔기 때문 입니다.
Vitali Kuzmin

@VitaliKuzmin 여전히 답변에 명확성이 없습니다. 당신의 대답은 정확 수 있으며, 그것은 당신을 위해 일한 수 있지만 여기에 제시된 방법은 쉬운 독자 혼동되지 않고
mannedear

3
@mannedear 내 첫 번째 의견이 귀하의 의견에 대한 답변이라고 생각합니다.
Vitali Kuzmin

내가 가져 오기 오류를 범했기 때문에이 답변을 +1했습니다! 내 모델 import javax.persistence.Table;대신 : 0 import org.springframework.data.relational.core.mapping.Table;. smh는이 빈 오류를 디버깅하는 데 5 시간이 걸렸습니다.
kalpaj agrawalla


6

일반적으로이 문제는 두 가지 측면에서 해결할 수 있습니다.

  1. 적절한 주석을 사용해야 봄 부팅 스캔 콩을 같이 @Component;
  2. 스캔 경로는 다른 모든 위에서 언급 한 것처럼 클래스를 포함합니다.

그건 그렇고, @Component, @Repository, @Service 및 @Controller 의 차이점에 대한 매우 좋은 설명이 있습니다.



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

이제 작동


2

나는 같은 문제가 있었다. 내 실수는 서비스 인터페이스에서 @Service 주석을 사용했다는 것입니다. @Service 주석은 ServiceImpl 클래스에 적용되어야합니다.


2

컨트롤러에서 @Autowired Annotation을 제거한 것과 동일한 문제가 발생했습니다. 리포지토리가 클래스 인 경우 리포지토리를 사용하려면 Autowired Annotation이 필요하지만 인터페이스 인 경우 제 경험에서 @Autowired Annotation을 추가 할 필요가 없습니다.


1

내 대상 폴더의 내 Mapper 구현 클래스가 삭제되었으므로 내 Mapper 인터페이스에는 더 이상 구현 클래스가 없습니다. 따라서 동일한 오류가 발생했습니다.Field *** required a bean of type ***Mapper that could not be found.

Maven으로 매퍼 구현을 재생성하고 프로젝트를 새로 고치기 만하면됩니다.


1

Mongo Repository와 함께 Spring Webflux를 사용하는 동안 도움을 구하기 위해이 게시물에 왔습니다.

내 오류가 소유자와 비슷했습니다.

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를 추가 할 필요가 없다
카렌 고 씨

1

스프링 부트를 사용하는 경우 spring-boot-starter-data-jpa를 종속성으로 가져와야합니다.


1

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

이것은 두 개의 빈이 같은 이름을 가질 때 발생할 수 있습니다.

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이 지정된 빈이 먼저 생성되고 유형이 GoogleAPI이고 GithubAPI둘 다 retrofitService()메서드에 의해 생성되기 때문에 해당 유형이 으로 덮여 있습니다. 이제 당신 @AutowiredGoogleAPI다음과 같은 메시지를 받게 될 것입니다.Field googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.


0

제 경우에는 Class MyprojectApplication을 동일한 수준의 모델, 컨트롤러, 서비스 패키지로 패키지 (com.example.start)에 넣었습니다.


0

오래되었다는 건 알지만 5 센트를 더하고 싶어요.

내가 사용 .service.service.impl폴더 구조에서의 구현과 서비스를 분리 할 수 있습니다. ServiceImplementation 부분을 구현하는 것을 잊으십시오.


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

"맨 위에있는 내 위켓 단위 테스트에서 수동으로 빈을 추가해야합니다."

appContext.putBean(myClass);

0

나는 모든 단계와 지시에 따라 여기에 OP를 따르고 사용자 이름과 암호 주위의 공백을 처리했습니다 (스프링이 속성 파일의 공백을 처리하더라도), 여전히 직면하고있었습니다.

could not find bean for ___Repository

(JPARepository를 확장하는 인터페이스)

또는 @EnableJPARepository를 추가 한 후

could not find bean for EntityManagerFactory

pom.xml에서 스프링 부트 스타터 부모 버전을 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.enabled
  3. 애플리케이션 속성의 spring.datasource.driverClassName = com.mysql.jdbc.Driver

0

일반 빈 오류 메시지를 검색하여 여기에 왔지만 실제로 클라이언트 인터페이스 의 주석을 통해 Spring Boot 애플리케이션에 가짜 클라이언트 를 추가하려는 사람에게는 @FeignClient위의 솔루션 중 어느 것도 작동하지 않습니다.

문제를 해결하려면 @EnableFeignClients다음과 같이 Application 클래스에 주석을 추가해야합니다 .

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

이러한 방식으로 수정은 @EnableMongoRepositories위에서 언급 한 수정 과 유사합니다 . 이 일반적인 오류 메시지에 모든 유형의 상황에 맞는 맞춤 수정이 필요하다는 것은 유감입니다 ...


0

두 가지 유형의 몽고 종속성-

<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"})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.