해결된 질문
작성
·
532
3
어노테이션을 만들고, BeanA에 어노테이션 붙인 후
테스트를 하는데 계속 BeanA 가 없다고 나옵니다.
어노테이션 만들기
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyExcludeComponent {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyIncludeComponent {
}
클래스에 필터 붙이기
@MyIncludeComponent
public class BeanA {
}
@MyExcludeComponent
public class BeanB {
}
3. 테스트(에러 발생)
BeanA에 NoSuchBeanDefinition에러가 발생합니다
includeFilters를 적용했는데 이유를 모르겠습니다 ㅠㅠ
@Test
void filterScan(){
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);
BeanA bean = ac.getBean(BeanA.class);
assertThat(bean).isNotNull();
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean(BeanB.class));
}
@Configuration
@ComponentScan(
includeFilters = @Filter( type = FilterType.ANNOTATION,
classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = MyExcludeComponent.class)
)
static class ComponentfilterAppConfig{
}
}
답변 6
0
OMG님 이렇게 신경 써주셔서 감사합니다 ㅠㅠ 처음에 할때는 이상없이 된 것으로 봐서 두번째로 제가 다시 해보려고 처음부터 해본것인데 제가 뭐 잘못할건지 잘 모르겠네요 ㅠㅠ
남겨주신 링크 클릭시 404에러가 떠서 일단 구글 드라이브에 업로드해서 링크로 드려봅니다
https://drive.google.com/file/d/19ct5xN8WehTOAxl-7GPJ_fFXYdmOCdbI/view?usp=sharing
감사합니다
0
클래스 BeanA , BeanB가 있는데도
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanA' available
이렇게 에러가 나네요
다만 타입으로 지정시에는 타입을 찾을 수 없다고 나오고 이름까지 지정시에는 빈 이름을 조회할 수 없다고 나옵니다.
혹시나 해서 강의 자료 코드를 그대로 복사해서 넣어봐도 에러가 뜹니다. 일단 컴파일 에러가 뜨지 않는것으로 봐서 테스트 코드에는 문제가 없고 아예 빈 자체를 인식을 못하는것 같은데 무엇이 문제인지 잘 모르겠네요 ㅠㅠ
안녕하세요. sy k님, 공식 서포터즈 OMG입니다.
코드를 확인해봐야 알 것 같습니다
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
https://bit.ly/3fX6ygx
주의: 업로드시 권한 문제 꼭 확인해주세요
공유 기본 설정은 비공개로 되어 있어 업로드 한 본인 계정만 접근이 가능합니다.
본인 계정이 아닌 링크를 통한 타 계정 접근이 가능한지 확인하는 방법은 업로드 한 구글 계정을 로그아웃하고 링크를 접속하여 "액세스 권한 요청 화면"이 출력되는지 확인을 해주세요.
감사합니다
0
public class ComponentFilterAppConfigTest {
@Test
void filterScan(){
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);
BeanA bean = ac.getBean("beanA", BeanA.class); assertThat(bean).isNotNull();
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean("beanB", BeanB.class));
}
@Configuration
@ComponentScan(
includeFilters = @Filter( type = FilterType.ANNOTATION,
classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = MyExcludeComponent.class)
)
static class ComponentfilterAppConfig{
}
}
그렇게 해도 에러가 납니다 ㅠㅠ
저렇게 해도 상관이 없을것 같아서 한번 해봤는데 이전것으로 올려졌나봐요
클래스가 BeanA, BeanB 각각 하나씩밖에 없기때문에 빈 이름과 클래스 두개를 지정 안하고
클래스 타입으로만 지정해도 검색이 되지 않을것 같아서 처음에 저렇게 해봤습니다 ㅠ
0
안녕하세요. sy k님, 공식 서포터즈 OMG입니다.
2가지 문제 중 하나이지 않을까 싶습니다.(두번째가 더 가능성 높다고 생각합니다.)
1. BeanA bean = ac.getBean(BeanA.class); assertThat(bean).isNotNull();
이 부분을 강의와 동일하게 작성해서 확인해주세요
답변에서 영한님이 말씀하시는 것처럼 스캔 대상의 위치로 인한(패키지 경로) 문제일 것 같습니다.
우선 패키지명이 강의와 다른 것으로 보아 위치도 확인해봐야 알 것 같아요.
좌측의 패키지 구조를 확인할 수 있게 캡쳐(전체 클래스(테스트 코드 포함) 확인 가능하게)해서 올려주세요
감사합니다.
@Test
void filterScan(){
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentfilterAppConfig.class);
BeanA bean = ac.getBean(BeanA.class); assertThat(bean).isNotNull();
Assertions.assertThrows(NoSuchBeanDefinitionException.class, () ->
ac.getBean(BeanB.class));
}
@Configuration
@ComponentScan(
includeFilters = @Filter( type = FilterType.ANNOTATION,
classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = MyExcludeComponent.class)
)
static class ComponentfilterAppConfig{
}
}
네, 말씀하신것 처럼 이렇게 작성했는데 BeanA 가 왜 빈으로 등록이 안되는지 모르겠네요 ㅠㅠ