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


109

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

***************************
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그것으로.


애플리케이션 컨텍스트 파일은 어디에 있습니까? 없는 경우 @ComponentScan 과 같은 주석으로 Spring에 힌트 를 제공 하여 모든 빈을 사용할 수 있도록하는 것을 고려해야 합니다.
Mario Santini

@MarioSantini 갱신 1 참조하십시오
Mike3355

각 업데이트 후 오류가 변경되었다고 가정합니다. 가능하면 프로젝트 구조를 게시하고 각 경우에 오류 로그 / 스택 트레이스를 게시합니다. "무언가"가 아닌 "왜"오류가 발생했는지 아는 것이 오류를 없애는 것이 좋습니다. 비슷한 문제를 겪는 다른 사람들에게도 도움이 될 것입니다.
Ameen.M 2016

답변:


201

프로젝트가 여러 모듈로 나뉘었기 때문일 수 있습니다.

@SpringBootApplication
@ComponentScan({"com.delivery.request"})
@EntityScan("com.delivery.domain")
@EnableJpaRepositories("com.delivery.repository")
public class WebServiceApplication extends SpringBootServletInitializer {

5
멋있는. 내 프로젝트는 여러 모듈로 나뉩니다. ComponentScan이 내 문제를 해결했습니다!
kholofelo Maloma

ComponentScan 주석은 내 문제를 해결하지만 @EnableAutoConfiguration은 해결하지 않습니다
jpl

실제로 EnableAutoConfiguration은 특정 항목에 대한 기본 "검색 패키지"를 암시 적으로 정의하며 루트 패키지를 사용하면 basePackage 속성을 지정하지 않고도 ComponentScan 주석을 사용할 수 있습니다. 메인 클래스가 루트 패키지에있는 경우 @SpringBootApplication 주석을 사용할 수 있습니다
jpl

1
이 솔루션은 버전 2.0.4에서이 오류를 해결하는 데 도움이되었습니다.
manu muraleedharan

2
예, 프로젝트가 다른 모듈로 나뉘어져 있기 때문입니다. @EntityScan그리고 @EnableJpaRepositories올바른 패키지 이름으로 날 위해 일했습니다.
Adi Sivasankaran

52

... 기회가
당신이 누락 될 수 있습니다 @Service, @Repository당신의 각각의 구현 클래스에 주석.


2
이것은 허용되는 대답이어야하며 간단하고 요점을 수정해야합니다. 감사합니다.
nightfury

1
나를 위해 일했습니다. 감사.
Okafor T Kosiso

1
감사합니다. @Repository 주석이 누락되었습니다
sergodeeva

1
네 이것이 답이 될 것입니다. 위의 답변은 단순히 스캔이 실패했다고 가정 한 것입니다.
Sumit Badsara

48

지원자 클래스가 스캔되지 않은 것 같습니다. 기본적으로 루트를 넣은 클래스로 시작하는 모든 패키지 @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."의 모든 구성 요소를 스캔합니다.


내 프로젝트는 구조가 다른 모듈입니다. 예를 들어 서비스에는 자체 모듈과 build.gradle. 이러한 build.gradle모듈 이름은 dependenciesmain 메서드를 사용하여 모듈에 추가됩니다 . 따라서 당신이 보았을 때 @ComponentScan("module-service")그것이 내가 효과가 있다고 생각한 것입니다. 그러나 내부 module-service에는 하나의 패키지가 있습니다. 그래서 내 질문은 어떻게 생겼을까 요? 패키지 이름이나 모듈 이름 또는 두 가지 모두를 지정합니까?
Mike3355

패키지가 다른 모듈에 속하는지 여부는 중요하지 않습니다. 구성 요소를 스캔해야하는 패키지는 스프링으로 지정되어야합니다. "scanBasePackages"속성에서 모든 모듈의 모든 "루트"패키지 이름을 제공 할 수 있습니다. 모듈이 아니라 언급해야하는 모든 "패키지"도 있습니다.
Ameen.M 2016

당신이 말한대로 오류가 사라졌지 만 또 다른 패키지에 대해서만 불평했습니다. 당연히 목록에 추가했지만 사라지지 않을 것입니다. 다음과 같이 구현했습니다.@SpringBootApplication(scanBasePackages= {"com.delivery.service","com.delivery.request"})
Mike3355

방금했고 @SpringBootApplication(scanBasePackages= "com")JPA 저장소에 대해 불평하고 있습니다. 대단히 감사합니다. 위의 작업을 수행하면 봄이 "com"으로 시작하는 모든 패키지를 스캔 할 것이라는 것을 몰랐습니다.
Mike3355

23

기본적으로 이것은 "다른 패키지"에 클래스 애플리케이션이있을 때 발생합니다. 예를 들면 :

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

덜 우아한 또 다른 방법은 모든 구성 클래스를 동일한 패키지에 넣는 것입니다.


2
사실, @ComponentScan위의 시나리오에서는 지정할 필요가 없습니다 . 당신의 Application.class( @SpringBootApplication주석이있는) com.server은 어쨌든 com.server.config뿐만 아니라 com.server.repository.
Ameen.M

@ Ameen.M 그것은 내 정확한 질문입니다. 왜 여전히 해결할 수 없으며 왜 mongo repos에 대한 명시 적 스캔이 필요 @EnableMongoRepositories합니까?
Karthikeyan 2018

10

제 경우에는 끔찍한 실수를했습니다. 나는 @Service서비스 인터페이스를 올렸다.

그것을 고치기 위해 나는 @Service서비스 파일의 구현을했고 그것은 나를 위해 일했습니다.


저도 마찬가지입니다. 감사합니다
Manta

7

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

5

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


4

제 경우에는이 두 가지 옵션이 작동했습니다.

  1. //@ComponentScan ({"myapp", "myapp.resources","myapp.services"}) 포함 을 보유하고있는 패키지 Application.class목록을, 또는

  2. 간단히 추가 @EnableAutoConfiguration; 모든 스프링 빈을 자동으로 인식합니다.


3

당신은 롬복를 사용하는 경우에도 이러한 문제가 발생할 수 있습니다 당신은 추가 @RequiredArgsConstructor@NonNull필드하지만 일부 필드는 생성자에 주입 할 수 없습니다. 이것은 동일한 오류가 발생할 가능성 중 하나 일뿐입니다.

매개 변수 0에는 찾을 수없는 MissingBeanName 유형의 Bean이 필요합니다.

제 경우 오류는 @NonNull응용 프로그램 을 제거한 후 문제가 발생한 컨트롤러를 알려주었습니다.


3

Spring Boot 2를 사용하는 Maven 다중 모듈 프로젝트에서 익숙한 문제에 직면했습니다. 문제는 하위 Maven 모듈의 패키지 이름 지정과 관련이 있습니다.

@SpringBootApplication은 @ComponentScan, @EnableAutoConfiguration, jpa-repositories, json-serialization 등과 같은 많은 구성 요소를 캡슐화합니다. 그리고 그는 @ComponentScan을 com. *******. space 패키지에 넣습니다. com. *******. space 패키지의이 부분은 모든 모듈에 대해 공통이어야합니다.

수정을 위해 :

  1. 모든 모듈 패키지의 이름을 바꿔야합니다. 즉, 동일한 상위 부분 인 모든 Maven 모듈의 모든 패키지에 있어야합니다. 예 : com. *******. space
  2. 또한 진입 점을이 패키지로 이동해야합니다-com. *******. space

2

온라인에서 답변을 찾았지만 제 사건에 대한 적절한 해결책이없는 것 같습니다. 처음에는 모든 것이 다음과 같이 잘 작동합니다.

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
}

그런 다음 무언가를 캐시하기 위해 맵을 추가하려고하는데 다음과 같이됩니다.

@Slf4j
@Service
@AllArgsConstructor(onConstructor = @__(@Autowired))
public class GroupService {
    private Repository repository;
    private Service service;
    Map<String, String> testMap;
}

팔!

Description:

Parameter 4 of constructor in *.GroupService required a bean of type 'java.lang.String' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

나는 제거 @AllArgsConstructor(onConstructor = @__(@Autowired))및 추가 @Autowired각각 repositoryservice제외 Map<String, String>. 이전처럼 작동합니다.

@Slf4j
@Service
public class SecurityGroupService {
    @Autowired
    private Repository repository;
    @Autowired
    private Service service;
    Map<String, String> testMap;
}

이것이 도움이되기를 바랍니다.


2

응용 프로그램에서 아래 주석을 추가 한 후 저에게 효과적이었습니다.

@ComponentScan({"com.seic.deliveryautomation.mapper"})

아래 오류가 발생했습니다.

"에서 생성자의 매개 변수 1에는 찾을 수없는 매퍼 유형의 Bean이 필요합니다.



2

두 개의 다른 클래스에서 실수로 동일한 빈을 정의한 경우에도이 오류가 발생합니다. 나에게 일어난 일입니다. 오류 메시지가 잘못된 것입니다. 여분의 빈을 제거했을 때 문제가 해결되었습니다.


1
@SpringBootApplication
@MapperScan("com.developer.project.mapper")

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

1

@Service 클래스가 추상으로 표시된 경우 이러한 상황이 발생할 수 있습니다.


1

클래스 종속성이 Spring에 의해 관리되는 경우 POJO 클래스 내에 기본 / 빈 arg 생성자를 추가하는 것을 잊은 경우이 문제가 발생할 수 있습니다.


1

누군가를 도울 수 있습니다. 나는 같은 문제, 같은 오류 메시지, 같은 모든 것을 가졌습니다. 나는 다른 답변에서 해결책을 시도했지만 내가 사용하고있는 bean이 실제로 autowired와 같은 이름을 가지고 있다는 것을 깨달을 때까지 도움이되지 않았습니다. 리팩터링 도중에 발생했기 때문에 클래스 이름을 변경해야했고 결과적으로 긍정적이었습니다. 건배


1

나는 같은 문제에 직면했다. Mongo DB 저장소는 Spring 부트로 식별되었지만 mongo 저장소를 확장 한 저장소 인터페이스에 대해 Bean을 생성하지 않았습니다.

제 경우의 문제는 "봄 + 망고"에 대한 maven pom의 잘못된 버전 사양이었습니다. 나는 아티팩트의 그룹 ID를 변경했고 모두 마술처럼 작동했습니다. 스프링 부트가 모든 것을 처리하므로 주석이 필요하지 않습니다.

문제를 해결하는 동안 웹 전체에서 솔루션을 찾고 있었고이 문제가 실제로 프로젝트 구성과 관련이 있다는 것을 깨달았습니다.이 문제에 직면 한 사람은 먼저 프로젝트 설정을 확인하고 봄부터 디버그를 활성화하여 실패에 대한 자세한 내용을 확인하고 세심한주의를 기울여야합니다. 정확히 그 과정에서 생성이 실패했습니다.


0

제 경우에는 가져 오기가 잘못 되었기 때문에이 오류가 나타납니다. 예를 들어 봄을 사용하면 가져 오기가 자동으로 나타납니다.

import org.jvnet.hk2.annotations.Service;

그러나 나는 필요했다 :

import org.springframework.stereotype.Service;

0

RestTemplate을 서비스 클래스에 주입해야하는 경우가있었습니다. 그러나 RestTemplate은 서비스 클래스에서 선택할 수 없습니다. 내가 한 일은 메인 애플리케이션과 동일한 패키지 아래에 래퍼 클래스를 만들고 래퍼를 Component로 표시하고이 컴포넌트를 서비스 클래스에 자동 연결하는 것입니다. 문제 해결됨. 그것이 당신에게도 효과가 있기를 바랍니다


0

내 실수는 내가 포함했다는 것입니다.

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

대신에:

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

0

RequestController에서 @Bean 주석이 누락되었다고 생각합니다.

파일에 Bean을 추가하면 내 문제가 해결
되었습니다. tutorialspoint에서 Spring Boot를 배우는 동안이 솔루션을 얻었습니다.

private Applicant applicant;

@Bean 
public Applicant applicant() { 
    return new Applicant(); 
}

0

Spring Boot Data JPA Starter 종속성을 추가하면 문제가 해결되었습니다.

메이븐

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.2.6.RELEASE'

또는 여기 로 바로 갈 수 있습니다.


이 경우에는 실제로 적용되지 않습니다. 데이터베이스에 대한 연결 세부 정보를 묻는 메시지가 표시됩니다 (데이터 소스 구성 실패 : 'url'속성이 지정되지 않았으며 포함 된 데이터 소스를 구성 할 수 없습니다.). 데이터베이스와 상호 작용하지 않고 수동으로 테스트하려는 상황에서는 작동하지 않습니다.
Thomas Okonkwo

0

당신이 사용하는 경우 interface당신이 할 수있는 확장 CrudRepository<Applicant,Long>@Repository주석.


0

예제별로 사용 @EnableMongoRepositories(YOUR_MONGO_REPOSITORIES_PACKAGE)하고 나중에 패키지 이름을 변경하거나 다른 위치로 이동할 때 문제가 나타날 수도 있습니다 .

다중 모듈 메이븐 프로젝트 및 스프링 부트 내에서 자주 직면했습니다.


0

인터페이스@autowired 하려고 할 가능성있습니다. 전에 인터페이스를 구현가.

예제 솔루션 :

    **HomeController.java**
    class HomeController{

      @Autowired
      UserService userService;
    .....
    }
----------------------------------------------------------------------
    **UserService.java** 
    public interface UserService {
        User findByUsername(String username);
    .....
    }
-----------------------------------------------------------------------
     **UserServiceImpl.java**
     @Service
     public class UserServiceImpl implements UserService{

         public User findByUsername(String username) {
           return userDao.findByUsername(username);
         }
        ....
      }

<i>This is not italic</i>, and [this is not a link](https://example.com)

0

스레드 실행 메소드에서 @Service와 같은 주석 유형 구성을 제거하십시오.

@Service, @Component

0

아래와 같이 프로젝트 구조를 구성 해보십시오.

모든 repo, 서비스, 패키지를 기본 패키지의 하위 패키지에 넣으십시오.

package com.leisure.moviemax;  //Parent package
        
@SpringBootApplication
@PropertySource(value={"classpath:conf.properties"})
    
public class MoviemaxApplication implements CommandLineRunner {
        
package com.leisure.moviemax.repo; //child package

@Repository
public interface UsrRepository extends JpaRepository<UserEntity,String> {

0

spring은 세계를 스캔하지 않는다는 것을 상기시켜주는 것은 springbootapplication이 저장된 패키지 아래의 모든 것을 의미하는 표적 스캐닝을 사용합니다. 따라서 다른 springbootapplication 패키지에 서비스 인터페이스가 있기 때문에 "[Spring-Boot] 구성에서 '패키지'유형의 bean 정의를 고려하십시오."라는 오류가 나타날 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.