다음과 같은 오류가 발생합니다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicant in webService.controller.RequestController required a bean of type 'com.service.applicant.Applicant' that could not be found.
Action:
Consider defining a bean of type 'com.service.applicant.Applicant' in your configuration.
이 오류는 전에 본 적이 없지만 @Autowire가 작동하지 않는 것이 이상합니다. 프로젝트 구조는 다음과 같습니다.
지원자 인터페이스
public interface Applicant {
TApplicant findBySSN(String ssn) throws ServletException;
void deleteByssn(String ssn) throws ServletException;
void createApplicant(TApplicant tApplicant) throws ServletException;
void updateApplicant(TApplicant tApplicant) throws ServletException;
List<TApplicant> getAllApplicants() throws ServletException;
}
신청자 Impl
@Service
@Transactional
public class ApplicantImpl implements Applicant {
private static Log log = LogFactory.getLog(ApplicantImpl.class);
private TApplicantRepository applicantRepo;
@Override
public List<TApplicant> getAllApplicants() throws ServletException {
List<TApplicant> applicantList = applicantRepo.findAll();
return applicantList;
}
}
이제 Autowire Applicant 만 가능하고 액세스 할 수 있어야합니다. 그러나이 경우에는 제 전화를 걸어도 작동하지 않습니다. @RestController:
@RestController
public class RequestController extends LoggingAware {
private Applicant applicant;
@Autowired
public void setApplicant(Applicant applicant){
this.applicant = applicant;
}
@RequestMapping(value="/", method = RequestMethod.GET)
public String helloWorld() {
try {
List<TApplicant> applicantList = applicant.getAllApplicants();
for (TApplicant tApplicant : applicantList){
System.out.println("Name: "+tApplicant.getIndivName()+" SSN "+tApplicant.getIndSsn());
}
return "home";
}
catch (ServletException e) {
e.printStackTrace();
}
return "error";
}
}
———————— 업데이트 1 ———————–
나는 추가했다
@SpringBootApplication
@ComponentScan("module-service")
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
오류가 사라졌지 만 아무 일도 일어나지 않았습니다. 그러나 추가하기 전에 Applicant
에서 처리하는 모든 것을 주석으로 처리했을 때 문자열을 반환 할 수 있었 으므로, 따라서 작동 중임 을 의미하므로 이제 건너 뛰고 있습니다. 나는 지금 못 생겼다 .RestController
@ComponentScan()
UI
RestController
Whitelabel Error Page
——————— 업데이트 2 ————————— —
불평하는 빈의 기본 패키지를 추가했습니다. 오류는 다음과 같습니다.
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method setApplicantRepo in com.service.applicant.ApplicantImpl required a bean of type 'com.delivery.service.request.repository.TApplicantRepository' that could not be found.
Action:
Consider defining a bean of type 'com.delivery.request.request.repository.TApplicantRepository' in your configuration.
나는 추가했다 @ComponentScan
@SpringBootApplication
@ComponentScan({"com.delivery.service","com.delivery.request"})
public class WebServiceApplication extends SpringBootServletInitializer {
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(WebServiceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(WebServiceApplication.class, args);
}
}
—————————- 업데이트 3 ——————– –
첨가:
@SpringBootApplication
@ComponentScan("com")
public class WebServiceApplication extends SpringBootServletInitializer {
여전히 내에 대해 불평 ApplicantImpl
클래스 @Autowires
내의 repo TApplicantRepository
그것으로.
답변
프로젝트가 여러 모듈로 나뉘었기 때문일 수 있습니다.
@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {
답변
… 기회가
당신이 누락 될 수 있습니다 @Service
, @Repository
당신의 각각의 구현 클래스에 주석.
답변
지원자 클래스가 스캔되지 않은 것 같습니다. 기본적으로 루트를 넣은 클래스로 시작하는 모든 패키지 @SpringBootApplication
가 스캔됩니다.
main
클래스 “WebServiceApplication”이 “”에 있다고 가정하면 ” com.service.something
“에 속하는 모든 구성 요소 com.service.something
가 스캔 되고 ” “은 스캔 com.service.applicant
되지 않습니다.
“WebServiceApplication”이 루트 패키지에 속하고 다른 모든 구성 요소가 해당 루트 패키지의 일부가되도록 패키지를 재구성 할 수 있습니다. 또는 @SpringBootApplication(scanBasePackages={"com.service.something","com.service.application"})
“모든”구성 요소가 스프링 컨테이너에서 스캔되고 초기화되도록 등을 포함 할 수 있습니다 .
댓글에 따라 업데이트
maven / gradle에서 관리하는 여러 모듈이있는 경우 모든 봄 요구 사항은 스캔 할 패키지입니다. 스프링에게 “com.module1″을 스캔하라고 지시하고 루트 패키지 이름이 “com.module2″인 다른 모듈이 있으면 해당 구성 요소는 스캔되지 않습니다. Spring에 “com” 을 스캔하도록 지시 하면 ” com.module1.
“및 ” com.module2.
“의 모든 구성 요소를 스캔합니다.
답변
기본적으로 이것은 “다른 패키지”에 클래스 애플리케이션이있을 때 발생합니다. 예를 들면 :
com.server
- Applicacion.class (<--this class have @ComponentScan)
com.server.config
- MongoConfig.class
com.server.repository
- UserRepository
Application.class에서이 문제를 해결합니다.
@SpringBootApplication
@ComponentScan ({"com.server", "com.server.config"})
@EnableMongoRepositories ("com.server.repository") // this fix the problem
덜 우아한 또 다른 방법은 모든 구성 클래스를 동일한 패키지에 넣는 것입니다.
답변
제 경우에는 끔찍한 실수를했습니다. 나는 @Service
서비스 인터페이스를 올렸다.
그것을 고치기 위해 나는 @Service
서비스 파일의 구현을했고 그것은 나를 위해 일했습니다.
답변
Bean이 @Autowired와 동일한 패키지에 있으면 이러한 문제가 발생하지 않습니다. 그러나 Bean은 기본적으로 다른 패키지에서 액세스 할 수 없습니다. 하기 위해서는 이 문제를 해결하려면 다음 단계를 수행합니다 :
- 메인 클래스에서 다음을 가져옵니다.
가져옵니다 import org.springframework.context.annotation.ComponentScan; - 기본 클래스에 주석을 추가하십시오.
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringExampleApplication.class, args);
}
}
답변
@Repository로 리포지토리에 주석을 달면 간단하게 만들 수 있다고 생각하면 Spring Framework에서 자동으로 활성화됩니다.