[java] ‘필드를 찾을 수없는 유형의 빈이 필요합니다.’ mongodb를 사용하는 오류 스프링 편안한 API
그래서 저는 몇 주 동안 Spring을 배우고 있었고,이 튜토리얼을 따랐습니다.
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를 등록 해야한다는 것을 알았 습니다. 내가했지만 작동하지 않습니다. 나는 이것에 정말 익숙해 져서 무슨 일이 일어나고 있는지 전혀 모른다.
답변
해결했습니다. 따라서 기본적으로 @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
답변
@Service
service / UserService.java에를 추가하십시오 .
답변
나는 또한 같은 오류가 있었다.
***************************
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
})
답변
동일한 문제가 발생하여 서비스, dao 및 도메인 패키지보다 한 수준 높은 패키지에 응용 프로그램을 배치하기 만하면되었습니다.
답변
이 스레드는 현재 오래되었지만 다른 사람들에게 유용 할 수있는 내 답변을 게시하고 있습니다.
나는 같은 문제가 있었다. 다른 모듈에 같은 이름을 가진 다른 클래스가 있음이 밝혀졌습니다. 나는 그 수업의 이름을 바꾸고 문제를 해결했습니다.
답변
자동 가져 오기 때문에 많은 시간을 보냈습니다. 인 IntelliJ 아이디어는 somewhy 수입 @Service
에서 import org.jvnet.hk2.annotations.Service;
대신 import org.springframework.stereotype.Service;
!
답변
@Service
서비스 구현에 주석 을 추가 해야합니다.