listener 에서 서비스 메서드 호출
- 작성자 :
- 김*현
- 작성일 :
- 2013-12-04 11:04:33
- 조회수 :
- 1,635
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
dispatcher-servlet.xml 에 별도의 listener을 등록하여 ServletContextListener 를 구현한 listener 클래스를 생성하였습니다.
생성한 리스너에서 Servce 클래스의 특정 메서드를 호출하여 작업을 해야 하는데 이때 아래와 같은 에러가 발생하면서 exception이 발생합니다.
심각: Exception sending context initialized event to listener instance of class org.test.com.listener.TestListener
java.lang.NullPointerException
at org.test.com.listener.TestListener.contextInitialized(TestListener.java:28)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
12월 04, 2013 10:06:03 오전 org.apache.catalina.core.StandardContext startInternal
심각: Error listenerStart
12월 04, 2013 10:06:03 오전 org.apache.catalina.core.StandardContext startInternal
심각: Context [] startup failed due to previous errors
---------------------------------------------------------------------------------
리스너 클래스
public class TestListener implements ServletContextListener{
protected Log log = LogFactory.getLog(this.getClass());
@Autowired
TestServiceImpl testService;
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("시작");
testService.selectList();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
}
------------------------------------------------------------------------------------
리스너 등록
<listener>
<listener-class>org.test.com.listener.TestListener</listener-class>
</listener>
---------------------------------------------------------------------------------------
리스너에서 호출하는 서비스와 서비스에서 호출하는 dao 빈은 로그상 생성이 된 것으로 확인됩니다.
생성한 리스너에서 Servce 클래스의 특정 메서드를 호출하여 작업을 해야 하는데 이때 아래와 같은 에러가 발생하면서 exception이 발생합니다.
심각: Exception sending context initialized event to listener instance of class org.test.com.listener.TestListener
java.lang.NullPointerException
at org.test.com.listener.TestListener.contextInitialized(TestListener.java:28)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
12월 04, 2013 10:06:03 오전 org.apache.catalina.core.StandardContext startInternal
심각: Error listenerStart
12월 04, 2013 10:06:03 오전 org.apache.catalina.core.StandardContext startInternal
심각: Context [] startup failed due to previous errors
---------------------------------------------------------------------------------
리스너 클래스
public class TestListener implements ServletContextListener{
protected Log log = LogFactory.getLog(this.getClass());
@Autowired
TestServiceImpl testService;
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("시작");
testService.selectList();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
}
------------------------------------------------------------------------------------
리스너 등록
<listener>
<listener-class>org.test.com.listener.TestListener</listener-class>
</listener>
---------------------------------------------------------------------------------------
리스너에서 호출하는 서비스와 서비스에서 호출하는 dao 빈은 로그상 생성이 된 것으로 확인됩니다.
A
안녕하세요. 김도현님
dao빈을 생성해서 쿼리를 실행하실려고 하시는 지요?
web.xml에서 리스너를 생성해서 스프링 컨테이너에 있는 빈에 대해서 접근을 할 수가 없습니다.
그렇기 때문에 별도로 작성하신 리스너에서 해당 빈을 가져오기 위해서는 직접적으로 해당빈을 생성하셔서 getBean을 통해서 호출을 해 주셔야 합니다.
예시)
ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"services.xml", "daos.xml"});
Foo foo = (Foo)context.getBean(“foo”);
또한 iBatis 등을 사용하시기 위해서도 ClassPathXmlApplicationContext 등을 통해서 빈을 선언해서 사용하셔야 합니다.
하지만 리스너 대신에 인터셉터를 이용해서 비슷한 기능을 구현할 수가 있습니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:handlermapping&s[]=interceptor
고맙습니다.
dao빈을 생성해서 쿼리를 실행하실려고 하시는 지요?
web.xml에서 리스너를 생성해서 스프링 컨테이너에 있는 빈에 대해서 접근을 할 수가 없습니다.
그렇기 때문에 별도로 작성하신 리스너에서 해당 빈을 가져오기 위해서는 직접적으로 해당빈을 생성하셔서 getBean을 통해서 호출을 해 주셔야 합니다.
예시)
ApplicationContext context = new ClassPathXmlApplicationContext( new String[] {"services.xml", "daos.xml"});
Foo foo = (Foo)context.getBean(“foo”);
또한 iBatis 등을 사용하시기 위해서도 ClassPathXmlApplicationContext 등을 통해서 빈을 선언해서 사용하셔야 합니다.
하지만 리스너 대신에 인터셉터를 이용해서 비슷한 기능을 구현할 수가 있습니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:handlermapping&s[]=interceptor
고맙습니다.