ClassPathXmlApplicationContext 관련 질문입니다.

1,612 views
Skip to first unread message

Jin Sam Kim

unread,
Nov 13, 2013, 10:18:31 AM11/13/13
to ks...@googlegroups.com
안녕하세요.

스프링 크론탭을 이용해서 스케쥴러를 돌리고 있습니다.

스케쥴러에서는 "패키지명.클래스명" 스트링을 이용해 클래스를 실행 시키는데요.

해당 클래스에서 

String[] location = {"application.xml", "common.xml"};

ApplicationContext context = new ClassPathXmlApplicationContext(location);

이 방식으로 context에서 bean을 가져오려 하는데, bean 생성에 실패하거나 없다고 나오네요.

생성에 실패하는 경우는 abstractService bean을 못 찾아서 에러가 난다고 익셉션이 발생합니다.

"패키지.클래스명"의 스트링으로 클래스를 동적으로 동작시키면 ApplicationContext를 이용할 때 제약이 있는 것일까요????

답변 부탁드립니다.

Sanghyuk Jung

unread,
Nov 13, 2013, 3:37:42 PM11/13/13
to ks...@googlegroups.com
안녕하세요, 

알려주신 정보로는 "  '"패키지.클래스명"의 스트링으로 클래스를 동적으로 동작시키면" 이라는 의미를 정확히 짐작하기가 어렵습니다.. 

에러스택과 getBean을 시도한 코드부분, applicationContext 선언의 일부를 보여주셔야 파악이 될것 같습니다..


2013년 11월 14일 오전 12:18, Jin Sam Kim <ssa...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.

Jin Sam Kim

unread,
Nov 13, 2013, 7:06:06 PM11/13/13
to ks...@googlegroups.com
답변 감사합니다.

환경은 Spring 2.5를 사용합니다.

Class klass = Class.forName("com.abc.def.Klass");
Object obj = klass.newInstance();

이런 방식으로 동작을 시킨 것이고요.

해당 클래스에서는 

String[] location = {"application.xml", "common.xml"};

ApplicationContext context = new ClassPathXmlApplicationContext(location);

이와 같이 생성을 하였는데, context.containsBean("beanName") 하니까 false로 나오네요.

물론 beanName은 있습니다.

에러 내용은 해당 beanName이 없다는 내용입니다.

common.xml에 abstractService'가 있습니다.

====  에러 로그. 일부 내용 삭제 및 변경
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'beanName' defined in URL [file:/C:/../../../common.xml]: Could not resolve parent bean definition 'abstractService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'abstractService' is defined
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1032)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:982)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:968)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:420)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:592)
...
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)
at java.lang.Thread.run(Thread.java:595)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'abstractService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:968)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:737)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:734)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1018)
... 19 more
java.lang.NullPointerException
...
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
at java.util.concurrent.FutureTask.run(FutureTask.java:123)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)
at java.lang.Thread.run(Thread.java:595)




2013년 11월 14일 오전 5:37, Sanghyuk Jung <ben...@gmail.com>님의 말:

Jin Sam Kim

unread,
Nov 13, 2013, 7:27:03 PM11/13/13
to ks...@googlegroups.com
다시 자세히 보니 xml 파일의 path가 잘못된 것 같네요.

위의 소스에는 보안상의 이유로 path를 숨기느라 안 나타났지만 아래와 같이 class* 로 했는데, 파일이 없어도 에러가 안나는 군요.

String[] location = {"class*:conifg/???/common.xml"}




2013년 11월 14일 오전 9:06, Jin Sam Kim <ssa...@gmail.com>님의 말:

Jin Sam Kim

unread,
Nov 13, 2013, 7:28:17 PM11/13/13
to ks...@googlegroups.com
class* 가 아니라 classpath* 입니다.


2013년 11월 14일 오전 9:27, Jin Sam Kim <ssa...@gmail.com>님의 말:

Sanghyuk Jung

unread,
Nov 13, 2013, 8:19:12 PM11/13/13
to ks...@googlegroups.com
아무래도 common.xml을 제대로 찾지못하는것 같네요.
applciation.xml에서 include선언으로 commons.xml을 참조해보는등 다른 방식을 써서 테스트해볼수도 있어보입니다..


2013년 11월 14일 오전 9:28, Jin Sam Kim <ssa...@gmail.com>님의 말:

Jin Sam Kim

unread,
Nov 13, 2013, 8:25:10 PM11/13/13
to ks...@googlegroups.com
네. 말씀하신대로 path의 문제였습니다.

다행이 해결되었네요.

classpath*:...

하면 해당 파일을 찾지 못해도 에러가 안난다는게 키포인트였네요.

답변 주셔서 감사합니다. ^^




2013년 11월 14일 오전 10:19, Sanghyuk Jung <ben...@gmail.com>님의 말:
Reply all
Reply to author
Forward
0 new messages