이거 돌리면
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.kyulspring.web.BoardDAOTest': Unsatisfied dependency expressed through field 'boardDAO'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.kyulspring.web.board.dao.BoardDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1378)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:396)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:119)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.kyulspring.web.board.dao.BoardDAO' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1651)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1210)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593)
... 28 more
이런 에러 뜸..
boardDAO
설명보면서 따라하고 있어서 잘모르긴해..
다른사람도 같은 에러뜨던데..
그리고 <property name="mapperLocations" value="classpath:/mappers/**/*Mapper.xml" /> 여기에서 /**/이 어떻게 돌아가는거야?
예전에 배웠던거 같은데 기억이 안나네..
사실 지금 매퍼라던지 빈만드는것도 여러방법이 있었는데 기억이 안나서
스프링 배울 사이트 없으까
용자왕가오가이가
에러를 읽자
샤켓
빈을 못찾는거잖아 아이 모르겠다..
/**/ 이것만 알려주면 안대?
용자왕가오가이가
난 그걸 왜 적었는지 모르겠음
샤켓
mappers 하위폴더의 mapper.xml 전부 포함한다는뜻인듯
네임스페이스 대문자 오타 있던ㄷ ㅔ이거땜에 안댄건가 그래도 안대네
용자왕가오가이가
Mapper XMLファイルを明示的に読み込む
Mapperインタフェースを経由しないで直接SqlSession(SqlSessionTemplate)を使ってSQLを実行する場合は、SQLが定義されているMapper XMLファイルを明示的に読み込む必要があります。
そのような場合は、applicaion.propertiesに以下の定義を追加するだけです。
src/main/resources/applicaion.properties
mybatis.mapper-locations=classpath*:/mybatis/sqls/**/*.xml
カンマ区切りで複数のロケーションを指定することもできますし、
src/main/resources/applicaion.properties
mybatis.mapper-locations[0]=classpath*:/mybatis/sqls/aaa/**/*.xml
mybatis.mapper-locations[1]=classpath*:/mybatis/sqls/bbb/**/*.xml
という感じで指定することもできます。
また、propertiesファイルではなくyamlファイルを使用すると、
src/main/resources/applicaion.yml
mybatis:
mapper-locations:
- classpath*:/mybatis/sqls/aaa/**/*.xml
- classpath*:/mybatis/sqls/bbb/**/*.xml
という記述にすることもできます。
이거같은데
용자왕가오가이가
특정 디렉토리 이하 임의 디렉토리 안에 있는 임의xml파일 읽고 싶을때 쓰는거 아님?
샤켓
맞음 이후에 매퍼 추가 했을때 편하다고 하대
정보처리마법사
스프링에서 DI를 하려면 해당 인터페이스를 구현한 클래스가 빈으로 등록되어 있어야하는데,
오류를 보면 빈을 못찾는다고 하니까 root-context.xml에서 boadDaoImpl이 스캔되도록 설정되었는지 확인해보셈.
mapper/**/*Mapper.xml은 mapper디렉토리 하위, 모든 디렉토리들 안에 있는, 이름이 Mapper로 끝나는 xml파일들 모두를 나타내는거임.
하나의 xml파일에 모든 쿼리를 때려박아도 상관은 없지만,
시스템이 커져서 양이 많아지면 이게 이떤 쿼리들이 담긴 xml 인지 구분하기 편하게 xml이름과 디렉토리로 분리함.
예를들어 개드립 메뉴를 임의로 분류해서
mapper/컴퓨터/전체, 잡담, 모바일 ...Mapper.xml
mapper/읽을거리/전체, 기묘한 이야기, 괴담 ...Mapper.xml
mapper/게임/전체, LOL, 배그 ...Mapper.xml
대략 이런식으로 구조 잡아놓으면
컴퓨터판 모바일 게시판에서 DB쿼리 오류가 났다 싶으면
mapper/컴퓨터/모바일Mapper.xml에 있는 쿼리들만 확인해보면 되니까 유지보수가 조금 편해짐..
뭐..어짜피 매퍼 id는 중복되면 안되니까
모든 쿼리 id를 꿰차고있으면 분리하는게 의미없는 짓이긴 하지만
나같은 멍청한 개발자를 위한 조그만 배려임 헤헿
샤켓
지금 밖이라 물어보고 싶은걸 못물어본다ㅠㅠ
루트컨텍스트엔 사실 암것도 건드린거 없음
test패키지?에서 돌리면 저 에러뜨고
본 패키지에서 돌렸을 땐 제대로 나오더라고..
샤켓
@리파지토리가 자동으로 빈등록해주는거 아니에양?
베이스패키지 설정을 서블릿컨텍스트에 했는데
루트컨텍스트나 데이터소스컨텍스트처럼 contextconfiguration안시켜서 그런가?
서블릿컨텍스트도 넣어봤었던거같은데 아닌가
서블릿컨텍스트 베이스패키지 설정하는 그거
다른 컨텍스트에서 할라면
맨위에 스프링프레임워크 무슨 주소 여러개 입력하는거
컨텍스트파일마다 내용이다르던데 뭐 추가해야되는건가
정보처리마법사
루트 컨텍스트 보면 아마 컴포넌트 스캔이란 항목이 있을꺼임.
@repository나, @controller나, @service 등등 클래스에다 어노테이션 붙여놓으면 자동으로 빈 등록 해주는건데,
그걸 특정 패키지 제한적으로 스캔하는 설정도 있어서 확인이 필요해보였음..
근데 테스트에서만 안뜬다는거보면 그거 문제일수도 있겠다.
본 패키지에서의 classpath와, 테스트 패키지에서의 classpath가 다르거든
기존 리소스 경로를 잡아주거나, 테스트 패키지에 테스트 전용 리소스를 따로 작성해주면 될꺼야.
나는 스프링 설정을 xml이 아니라 자바로 설정하는걸 선호해서,
contextconfiguration에다 설정클래스.class만 명시해놓음 되니깐 간단함.
고로 자바 설정으로 넘어오셈 ㅋㅋㅋ
정보처리마법사
contextconfiguration는 말그대로 설정파일을 지정해주는거라서
니가 말한 루트컨텍스트는 스프링 설정파일인것 같고,
데이터소스컨텍스트는 데이터베이스 설정파일인것 같거든.
만약 루트컨텍스트에서 필요한 빈이 등록되도록 설정되어 있다면 문제는 없는거지
근데 컴포넌트 스캔하는 설정이 루트, 데이터소스 컨텍스트 2개에 없고,
서블릿컨텍스트에 설정되어있다면 contextconfiguration에 그것도 추가해줘야함~
아니면 루트컨텍스트에다가 설정을 추가하던가
테스트 실행할때 contextconfiguration에 명시된 설정파일을 읽어서 실행한다고 생각하고
거기에 명시된 부분에 boardDAOImpl이 빈으로 등록되는 설정이 있는가 우선 체크
그리고 방금전 답글단 내용대로 classpath 경로가 설정파일을 가리키는지 체크
샤켓
아 몬가 이해가 된거 같은데 직접해봐야 알거같다
해설 정말 고마워영ㅠㅠ
서블릿컨텍스트에
<context:component-scan base-package="com.kyulspring.web" />
이게 써져있는데 이거때문에
서블릿컨텍스트가 포함 안돼있어서 오류뱉는건지 확인해봐야겠다
이따가..