Annotation을 인식하지 못합니다.
- 작성자 :
- 김*희
- 작성일 :
- 2010-07-28 17:39:01
- 조회수 :
- 3,733
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요?
Controller, Impl 등이 아닌 별개의 프로그램(예. CustomTag)에서
Annotation을 이용하여 Properties 파일을 이용하려고 합니다.
그런데, null이 나오는거 보니, 서비스를 가져오지 못하나 봅니다.
Properties 서비스 뿐 아니라, 다른 프로그램에서 정상적으로 동작하는 모든 서비스들이 null 이 됩니다.
설정파일에서, 무엇을 추가해줘야 서비스를 불러올 수 있는지 궁금합니다.
------------------------------------------------
public class ValidationTagHandler extends SimpleTagSupport {
@Resource(name = "messageSource")
protected MessageSource messageSource;
public void doTag() throws JspException, IOException {
System.out.println("messageSource => " + messageSource);
==> null 찍힘
Controller, Impl 등이 아닌 별개의 프로그램(예. CustomTag)에서
Annotation을 이용하여 Properties 파일을 이용하려고 합니다.
그런데, null이 나오는거 보니, 서비스를 가져오지 못하나 봅니다.
Properties 서비스 뿐 아니라, 다른 프로그램에서 정상적으로 동작하는 모든 서비스들이 null 이 됩니다.
설정파일에서, 무엇을 추가해줘야 서비스를 불러올 수 있는지 궁금합니다.
------------------------------------------------
public class ValidationTagHandler extends SimpleTagSupport {
@Resource(name = "messageSource")
protected MessageSource messageSource;
public void doTag() throws JspException, IOException {
System.out.println("messageSource => " + messageSource);
==> null 찍힘
A
안녕하세요.. 김선희님
@Resource의 경우는 DI(Dependency Injection)의 기능으로 해당 클래스가 Spring의 Bean으로 도출되어 있지 않은 경우는 적용되지 않습니다.
즉, 위의 경우는 ValidationTagHandler가 @Component, @Serivce, @Repository, @Controller로 정의되어 있지 않으면 injection되지 않습니다.
추가적으로 TagLib의 경우는 Spring Bean으로 정의가 되더라도 해당 tagLib가 호출되는 방식이 Spring container에 의해 호출되는 방식(context.getBean 메소드를 통한 호출 또는 @Controller의 @RequestMapping에 의한 호출)이 아닌 경우 injection이 적용되지 않습니다.
taglib에 호출되는 instance와 Spring container에 의해 관리되는 instance 자체가 다르기 때문입니다.
이 경우는 일단.. SimpleTagSupport에서 제공하는 getJspContext를 통해 다음과 같이 ServletContext를 얻은 다음에.. Spring의 WebApplicationContext를 얻어서 getBean을 통해 처리하실 수 있을 것 같습니다.
PageContext pageContext = (PageContext)getJspContext(); // 일부 JSP/Servlet container의 경우 casting되지 못함..
ServletContext servlet = ((HttpServletRequest) pageContext.getRequest()).getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
MessageSource messageSource = (MessageSource) ctx.getBean("messageSource");
그럼.. 즐거운 하루되십시오.
감사합니다.
@Resource의 경우는 DI(Dependency Injection)의 기능으로 해당 클래스가 Spring의 Bean으로 도출되어 있지 않은 경우는 적용되지 않습니다.
즉, 위의 경우는 ValidationTagHandler가 @Component, @Serivce, @Repository, @Controller로 정의되어 있지 않으면 injection되지 않습니다.
추가적으로 TagLib의 경우는 Spring Bean으로 정의가 되더라도 해당 tagLib가 호출되는 방식이 Spring container에 의해 호출되는 방식(context.getBean 메소드를 통한 호출 또는 @Controller의 @RequestMapping에 의한 호출)이 아닌 경우 injection이 적용되지 않습니다.
taglib에 호출되는 instance와 Spring container에 의해 관리되는 instance 자체가 다르기 때문입니다.
이 경우는 일단.. SimpleTagSupport에서 제공하는 getJspContext를 통해 다음과 같이 ServletContext를 얻은 다음에.. Spring의 WebApplicationContext를 얻어서 getBean을 통해 처리하실 수 있을 것 같습니다.
PageContext pageContext = (PageContext)getJspContext(); // 일부 JSP/Servlet container의 경우 casting되지 못함..
ServletContext servlet = ((HttpServletRequest) pageContext.getRequest()).getServletContext();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
MessageSource messageSource = (MessageSource) ctx.getBean("messageSource");
그럼.. 즐거운 하루되십시오.
감사합니다.