복붙노트

[SPRING] '필드에서 찾을 수없는 유형의 bean이 필요합니다.' mongodb를 사용하여 오류 봄 편안한 API

SPRING

'필드에서 찾을 수없는 유형의 bean이 필요합니다.' mongodb를 사용하여 오류 봄 편안한 API

그래서 나는이 튜토리얼을 따라 일주일에 한 쌍의 봄을 배웠습니다.

RESTful 웹 서비스 빌드하기

내가 몽고 (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 파일을 실행할 때이 에러가 발생했다.

무엇이 잘못되었는지 확신 할 수 없기 때문에 인터넷 검색을 시작하고 Beans.xml 파일을 포함시키고 userService를 등록해야합니다. 나는 그것을했지만 작동하지 않습니다. 나는이 일에 정말로 익숙하지 않기 때문에 나는 실제로 어떤 일이 일어나고 있는지 전혀 모른다.

해결법

  1. ==============================

    1.그것을 해결했습니다. 따라서 기본적으로 @SpringBootApplication 선언 아래에있는 모든 패키지가 검사됩니다.

    그것을 해결했습니다. 따라서 기본적으로 @SpringBootApplication 선언 아래에있는 모든 패키지가 검사됩니다.

    @SpringBootApplication 선언이있는 메인 클래스 ExampleApplication이 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
    
  2. ==============================

    2.service / UserService.java에 @Service를 추가하십시오.

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

  3. ==============================

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

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

    ***************************
    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);
        }
    }
    
  4. ==============================

    4.동일한 문제가 발생하여 애플리케이션, 패키지 및 도메인 패키지보다 한 수준 높은 패키지에 애플리케이션을 배치해야합니다.

    동일한 문제가 발생하여 애플리케이션, 패키지 및 도메인 패키지보다 한 수준 높은 패키지에 애플리케이션을 배치해야합니다.

  5. ==============================

    5.자동 가져 오기 때문에 많은 시간을 보냈습니다. Intellij Idey가 가져온 org.jvnet.hk2.annotations.Service에서 @Service를 가져 왔습니다. import org.springframework.stereotype.Service 대신에!

    자동 가져 오기 때문에 많은 시간을 보냈습니다. Intellij Idey가 가져온 org.jvnet.hk2.annotations.Service에서 @Service를 가져 왔습니다. import org.springframework.stereotype.Service 대신에!

  6. ==============================

    6.컨트롤러 클래스에 @Component를 추가하십시오. 이 작품을

    컨트롤러 클래스에 @Component를 추가하십시오. 이 작품을

  7. ==============================

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

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

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

  8. ==============================

    8.이 스레드는 오래되었지만 다른 사람들에게 유용 할 수있는 답변을 올리려고합니다.

    이 스레드는 오래되었지만 다른 사람들에게 유용 할 수있는 답변을 올리려고합니다.

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

  9. ==============================

    9.나는 동일한 문제점을 가지고있다. @EnableMongoRepositories ( "in.topthree.util")

    나는 동일한 문제점을 가지고있다. @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);
        }
    

    지금은 일하고있다.

  10. ==============================

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

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

  11. ==============================

    11.필자의 경우, 실수로 복사 및 붙여 넣기를 수행하는 동안 서비스 클래스 추상을 정의했습니다.

    필자의 경우, 실수로 복사 및 붙여 넣기를 수행하는 동안 서비스 클래스 추상을 정의했습니다.

    @Serivce
    @Valdiated
    public abstract class MyService { // remove the abstract modifier!!!
    }
    
  12. ==============================

    12.내 대상 폴더의 My Mapper 구현 클래스가 삭제 되었기 때문에 Mapper 인터페이스에는 더 이상 구현 클래스가 없습니다. 따라서 동일한 오류 필드가 *** *** Mapper 찾을 수없는 콩이 필요합니다.

    내 대상 폴더의 My Mapper 구현 클래스가 삭제 되었기 때문에 Mapper 인터페이스에는 더 이상 구현 클래스가 없습니다. 따라서 동일한 오류 필드가 *** *** Mapper 찾을 수없는 콩이 필요합니다.

    Maven을 사용하여 매퍼 구현을 재생성하고 프로젝트를 새로 고침하기 만하면 ...

  13. ==============================

    13.이것을 사용하여 내 문제를 해결.

    이것을 사용하여 내 문제를 해결.

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

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

    이것은 두 개의 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이며, retrofitService () 메소드에 의해 생성 된 GithubAPI로 덮여 있습니다. 이제 @Autowired GoogleAPI를 사용하면 com.example.GoogleService의 필드 googleAPI와 같은 메시지가 표시되어 'com.example.rest.GoogleAPI'유형의 빈을 찾을 수 없습니다.

  15. from https://stackoverflow.com/questions/42907553/field-required-a-bean-of-type-that-could-not-be-found-error-spring-restful-ap by cc-by-sa and MIT license