programing

'필드는 찾을 수 없는 유형의 빈을 필요로 했습니다.' mongodb를 사용한 오류 스프링 restful API입니다.

linuxpc 2023. 3. 12. 10:31
반응형

'필드는 찾을 수 없는 유형의 빈을 필요로 했습니다.' mongodb를 사용한 오류 스프링 restful API입니다.

그래서 나는 봄을 일주일 동안 배우고 이 튜토리얼을 따라하고 있다.

RESTful 웹 서비스 구축

내가 그것을 mongodb에 통합하려고 하기 전까지는 모든 것이 좋았다.그래서 저는 이 튜토리얼을 따릅니다.

MongoDB를 사용한 데이터 접근

하지만 제 연습은 여전히 첫 번째 것을 부분적으로 사용하고 있습니다.제 프로젝트 디렉토리 구조는 이렇습니다.

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

이것은 my 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 파일을 실행하면 이 에러가 발생합니다.


응용 프로그램 부팅 실패


설명:

필드 userService in main.java.rest.UsersController에는 'main.java.service' 유형의 빈이 필요합니다.UserService'를 찾을 수 없습니다.

액션:

main.java.service 유형의 빈을 정의하는 것을 고려해 보십시오.사용자 서비스'를 선택합니다.

가 잘 요.Beans.xmluserService service록록 。★★★★★★★★★★★★★★★★★★★★★★★★★★★저는 이런 일이 처음이라 무슨 일이 일어나고 있는지 정말 모르겠어요.

모든 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★@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

, 그럼 여기에다가 더해져요.@Serviceservice/UserService로 합니다.자바

저도 같은 오류가 있었습니다.

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

그리고 제 패키지는 수용된 답변과 같은 방식으로 구성되었습니다.메인 클래스에 다음과 같이 EnableMongoRepository 주석을 추가하여 문제를 해결했습니다.

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

해서 '어울리지 않다'를 해요.@Service서비스 구현에 대한 주석입니다.

같은 문제를 안고 있었습니다.@Autowired컨롤컨 Annotation이 "Autowired 을할 필요가 .@Autowired제 경험에서 나온 주석입니다.

수입하다 Intellij Idea somewhy imported Intelij Idea Import 이유@Service부에서import org.jvnet.hk2.annotations.Service;대 대신에import org.springframework.stereotype.Service;!!!!

같은 문제가 발생하여 어플리케이션을 서비스, dao 및 도메인 패키지보다 한 단계 높은 패키지에 넣기만 하면 되었습니다.

이 스레드는 이제 오래되었지만 다른 사람에게 도움이 될 수 있도록 답변을 게시합니다.

저도 같은 문제가 있었어요.다른 모듈에도 같은 이름의 클래스가 있는 것으로 나타났습니다.나는 그 반의 이름을 바꾸었고 그것이 문제를 해결했다.

spring to create bean and inject it class 에는 @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();
}

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

  1. 스프링 부츠에 적절한 주석을 사용하여 을 스캔해야 합니다.@Component;;;;
  2. 검색 경로에는 위에 언급된 다른 모든 클래스가 포함됩니다.

덧붙여서 @Component, @Repository, @Service, @Controller의 차이에 대해서는 매우 좋은 설명이 있습니다.

dao 클래스에 @Repository 추가

예:

@Repository
public class DaoClassName implements IIntefaceDao {
}

나는 똑같은 문제를 가지고 있었다.저도 같은 문제가 있었어요.가 해서 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★@Service이치노@ServiceServiceImpl 클클im 。

@ Annotations를 모두 사용하여 문제를 해결했습니다.(예, 봄을 맞이했습니다.)서비스 클래스를 사용하는 경우 @Service를 추가합니다.@Controller 및 @Repository도 마찬가지입니다.

그 후 App.java의 이 주석으로 문제가 해결되었습니다(JPA + 휴지 상태 사용 중).

@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

.spring-boot-starter-data-jpa 부츠프링 부츠를 이 됩니다.

컨트롤러 클래스에 @Component를 추가합니다.이 일이 잘 되길

일반적인 bean 에러 메시지를 구글에 검색하여 가져온 사용자 중 실제로 Spring Boot 어플리케이션에 가짜 클라이언트를 추가하려고 하는 사용자용입니다.@FeignClient클라이언트 인터페이스에 주석을 붙이면 위의 어떤 솔루션도 작동하지 않습니다.

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

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

이 방법으로 수정은 다음과 같습니다.@EnableMongoRepositories를 수정해 주세요.이 일반적인 오류 메시지가 모든 상황에 맞게 수정되어야 하는 것은 유감입니다.

Mongo Repository에서 Spring Webflux를 사용하면서 도움을 요청하러 왔습니다.

내 오류는 소유자와 비슷했다.

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

이전에 Spring MVC에서 작업하고 있었기 때문에 이 에러에 놀랐습니다.

도움을 찾는다는 것이 그렇게 명백하지 않았기 때문에, 이 질문은 다소 관련이 있고 검색 결과에서 이 질문이 높기 때문에 저는 이 질문에 대답합니다.

먼저, 수락이라고 표시된 답변에 언급된 내용, 즉 패키지 계층에 대해 기억해야 합니다.

두 번째로 중요한 것은 만약 당신이 Webflux를 사용한다면 당신은 봄 MVC를 사용할 때 다른 패키지를 사용해야 한다는 것입니다. 예를 들어, MongoDB를 위한 추가가 필요합니다.

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

마지막에는 -syslog가 있습니다.

@EnableMongoRepository("in.top3.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);
}

기능하게 되었다

몇 시간 동안이나 문제가 궁금했어요.그 이유는 명령어를 제외한 것입니다.이전에 테스트용으로 이것을 추가했습니다(그때 잊어버렸습니다).나는 누군가 같은 실수를 할 수 있다고 확신한다.

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })

...수정:

@SpringBootApplication

주 클래스에 a를 추가해야 합니다.@ComponentScan주석, 서비스 패키지를 검색하도록 지시합니다.그렇지 않으면 이러한 빈이 초기화되지 않습니다.

추가할 수 있습니다.@Service서비스 클래스를 정의하는 경우

예:

@Service
public class myService {

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

}

이것은 두 개의 콩이 같은 이름을 가지고 있을 때 발생할 수 있다.

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()방법.자, 당신이@Autowired a GoogleAPI 메시지가 올 예요.Field googleAPI in com.example.GoogleService required a bean of type 'com.example.rest.GoogleAPI' that could not be found.

대상 폴더의 Mapper 구현 클래스가 삭제되었기 때문에 Mapper 인터페이스에는 더 이상 구현 클래스가 없습니다.요.Field *** required a bean of type ***Mapper that could not be found.

메이븐으로 맵의 실장을 재생성하고 프로젝트를 갱신하기만 하면 되었습니다.

dao 클래스에 @Repository 추가

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

이 오류를 디버깅하는 데 약 2시간을 소비한 후 스프링 웹 MVC 종속성을 추가하는 것을 잊어버린 것을 어느 정도 알게 되었습니다.

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

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

오래된 건 알지만 내 5센트를 더하고 싶어

하였습니다..service ★★★★★★★★★★★★★★★★★」.service.impl폴더 구조에서 서비스를 구현과 분리할 수 있습니다.서비스 구현 부분을 구현하는 것을 잊으십시오.

이 메시지는 다음과 같습니다.

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

여기서 모든 절차와 지시에 따라 OP를 실행하고 사용자 이름과 비밀번호 주변의 빈칸을 처리했습니다(스프링이 속성 파일의 빈칸을 처리함에도 불구하고).

could not find bean for ___Repository

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

또는 @EnableJ를 추가한 후PAREpository

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.intervatorys.enabled로 되어 있습니다.
  3. spring.datasource.driverClassName=com.mysql.jdbc 를 지정합니다.응용 프로그램 속성 드라이버

2종류의 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

올바른 조합을 사용하고 있는지 확인하십시오.

언급URL : https://stackoverflow.com/questions/42907553/field-required-a-bean-of-type-that-could-not-be-found-error-spring-restful-ap

반응형