본문 바로가기

내컴퓨터/컴퓨터사용하기

NoSuchBeanDefinitionException: No bean named 'XXXX' is defined

*전자정부프레임워크

 

프로젝트를 만들고,

Controller를 만들고, annotation으로 @Controller를 지정해주었다.

AbstractServiceImpl을 상속받는 Service를 하나 만들고,

annotation을 @Service("testService")로 지정해주었다.

 

아까 만든 Controller에서,

서비스 변수를 하나 만들고, @Resource(name="testService")로,

아까 만들었던 Service 클래스에 붙인 @Service와 동일한 이름으로 맞춰주었다.

 

오마이갓.

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named testService" is defined

 

이거때문에 완전 헤맸다..

아무리봐도.. 뭘 잘못했는지 못찾았다.

Resource명과 Service명은 분명 일치하는데..뭐가 문제란 말인가!!

Controller는 잘 돌아가는데..왜 Service만 못 찾지??

 

resource폴더가 deploy되지 않아도 해당 문제가 발생한다지만, 내 경우는 아니었다.

 

나는 이렇게 해결했다.

(egov 샘플 프로젝트에서 설정파일을 그대로 copy&paste한게 잘못이었다 ㅠㅠ)

 

dispatcher-servlet.xml 

 <context:component-scan base-package="egovframework"> 

        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan> 

Service와 Repository에 관한 annotation이 exclude-filter 되어있다.

Service와 Repository는 annotation을 필터링 하지 않는다는 이야기.

일단은 위에 base-package를 내 패키지명에 맞춰서 수정해준다.

 

그런 다음 context-common.xml을 연다.  

아래 내용이 있나 확인해 본 후 없으면 추가해준다.

<context:component-scan base-package="egovframework">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
 </context:component-scan> 

base-package는 내 패키지에 맞춰주고,

Service와 Repository관련 annotation을 include 시켜주고 있다.

 

아직 초보라 왜 그런지는 모르겠으나..

egovSample 프로젝트 기준으로.. 위와같이 되어있다.

dispatcher-servlet.xml에서는 Controller만 include하고,

context-common.xml에서 Service와 Repository를 include하는 방식으로..

 

base-package를 맞춰주지 않으면,

해당 경로를 찾지 못해 annotation인식이 안되므로, base-package를 맞춰주는 것도 중요*

 

안드로이드만 하다가,

web을 하려니까 모르는거 투성이다 :(

맨날 삽질이야