[java] 구성 [Spring-Boot]에서 ‘패키지’유형의 빈 정의를 고려하십시오.

다음과 같은 오류가 발생합니다.

***************************
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()UIRestControllerWhitelabel 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은 기본적으로 다른 패키지에서 액세스 할 수 없습니다. 하기 위해서는 이 문제를 해결하려면 다음 단계를 수행합니다 :

  1. 메인 클래스에서 다음을 가져옵니다.
    가져옵니다 import org.springframework.context.annotation.ComponentScan;
  2. 기본 클래스에 주석을 추가하십시오.
@ComponentScan(basePackages = {"your.company.domain.package"})
public class SpringExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringExampleApplication.class, args);
    }
}


답변

@Repository로 리포지토리에 주석을 달면 간단하게 만들 수 있다고 생각하면 Spring Framework에서 자동으로 활성화됩니다.