티스토리 뷰
Spring에서 제공되는 Email 발송을 위한 Class 사용 시 xxx.xml 경로 지정 방법
보통 개발 할때 applicationContext-velocityengine-mail.xml 내용을 아래와 같이 사용하게 됩니다.
true resource.loader=class class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
이러한 방법은 WAS에서 Spring으로 개발된 WAR파일 을 Loading할때는 문제가 없습니다.
문제는 WAR로 Packaging 되었을때와 그렇지 않을때 applicationContext-velocityengine-mail.xml 파일을 수동으로
찾고자 할때 발생하게 됩니다.
보통 아래 예제처럼 사용 하는것 같습니다. 해외 Site에서도 이와 관련된 질문들이 많더군요.
ApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"classpath:applicationContext-velocityengine-mail.xml"});
setMailSender( (JavaMailSender)ctx.getBean("mailSender") );
setVelocityEngine((VelocityEngine)ctx.getBean("velocityEngine") );
위 방법으로 사용하게 됩니다. WAS에 Deploy 할때 WAR파일이 풀려 있는 상태에서만 사용가능 합니다.
즉 xxx.war로 된 압축파일로 사용 할때는 Email 발송 시 Exception이 발생 하게 됩니다.
주원인은 ClassPathXmlApplicationContext(new String[] {"classpath:applicationContext-velocityengine-mail.xml"});
문장에서 발생 하며, applicationContext-velocityengine-mail.xml 파일을 찾지 못하기 때문입니다.
이는 WAR 파일로 압축되었을때 와 WAR파일을 압축을 풀어서 Deploy할때 WAS에서 해당 Context의 시작점을 다르게 보기 때문입니다.
WAR로 압축된 상태에서 Deploy할때는 아래와 같이 사용 합니다.
ApplicationContext ctx =
new ClassPathXmlApplicationContext(new String[] {"classpath:../applicationContext-velocityengine-mail.xml"});
setMailSender( (JavaMailSender)ctx.getBean("mailSender") );
setVelocityEngine((VelocityEngine)ctx.getBean("velocityEngine") );
그러나 이러한 방법은 사실 좋은 방법이라고 볼수가 없습니다. 두가지 방법을 공통화 해서 사용해야 하나,
2가지 형태로 관리해야 한다는 것이 좀 모순 이지요.
설명드린 방법은 통상적인 방법이면서 이미 WAS에 의해 Deploy 되었을때 Loading되는 XML 을 또다시 별도로 불러들이는
방식으로 이러한 방법을 사용하지 말고 좀더 효율적인 방법이 있습니다.
즉 이미 Loading되어 있는 XML정보를 사용하는 방법 입니다. 즉 Context를 통해 이미 loading된 정보를 사용하는 방법으로
Spring의 구조 상 DWR로 동작하는 Class에서와 Controller Class에서 사용 할때 조금 다르게 사용해야 합니다.
DWR에서의 사용 예
WebContext wctx = WebContextFactory.get();
JavaMailSender mailSender = (JavaMailSender)wctx.getContainer().getBean("mailSender");
VelocityEngine velocityEngine = (VelocityEngine)wctx.getContainer().getBean("velocityEngine");
Controller에서의 사용 할때는 이미 Spring에 의해 전달받아 사용되기 때문에
MultiActionController Class를 상속받은 Controller에서만 사용 가능 하다.
JavaMailSender mailSender = (JavaMailSender)this.getApplicationContext().getBean("mailSender");
VelocityEngine velocityEngine = (VelocityEngine)this.getApplicationContext().getBean("velocityEngine");
'개발관련 이것저것 > Java Web' 카테고리의 다른 글
| Node.js 이야기 1탄 (0) | 2016.06.28 |
|---|---|
| RestFull API 개발을 위한 사전 준비사항 (1) | 2016.03.18 |
| Rest API의 Client 사용시 SSL 처리 (0) | 2016.03.18 |
| Https Server 구현시 주의 할 점 (0) | 2015.07.01 |
| JQuery를 이용하여 In Focus와 Out Focus 발생 시 CSS 조작 (0) | 2013.04.03 |
| JQuery를 사용한 Image Select (0) | 2013.02.06 |
| HttpServletResponse에서 getWriter() already Error 발생 시 주의 점 (0) | 2012.08.29 |
| POI를 사용하여 Java 서블릿에서 Excel File을 Stream으로 전송하기 (0) | 2012.05.14 |
- Total
- Today
- Yesterday
- GCC
- 상추
- Android
- C
- kernel
- 커피컵
- cross compile
- arm
- 1회용컵
- 고흥
- 커널
- 여행
- Linux
- CubieBoard2
- 크로스컴파일
- 식물
- 리눅스
- 식물 키우기
- 벌교
- 1회용
- 임베이디드
- 베란다
- 사무실
- 채소 키우기
- embeded
- 큐비보드
- 수경재배
- 버추얼박스
- 식물키우기
- C++
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |