- - PR -
StrutsのActionでメール送信機能が実装出来ない
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-03-01 12:07
Red Hat Linux9
JBoss3.2.3 Struts1.1 でWebアプリケーションを作成しています。 Actionでメール送信機能を実装しようとするとエラーが発生します。 以下がソース(MailAction.java)です。 ----------------------- package test; import org.apache.struts.action.*; import javax.servlet.http.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class MailAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { MailForm f = (MailForm)form; Properties props = new Properties(); props.put("mail.smtp.host", "localhost"); javax.mail.Session msession = javax.mail.Session.getDefaultInstance(props, null); MimeMessage msg = new MimeMessage(msession); msg.setFrom(new InternetAddress("test@test.co.jp", "テストユーザ", "iso-2022-jp")); msg.setRecipients(Message.RecipientType.TO, f.getTo()); msg.setSubject("テスト件名","iso-2022-jp"); msg.setText("本文", "iso-2022-jp"); msg.setHeader("Content-Type","text/plain"); msg.setSentDate(new java.util.Date()); Transport.send(msg); } catch (Exception e) { e.printStackTrace(); } // 結果のページを返す return mapping.findForward("success"); } } ----------------------- デバッグプリントを入れてみると、 MimeMessage msg = new MimeMessage(msession); ここでエラーが発生しているようです。 実装方法は、struts-blank.warを解凍して、メール送信用ページmail.jsp ----------------------- <%@ page contentType="text/html; charset=Shift_JIS" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <HTML><body> <html:form action="/Mail"> <html:text name="MailForm" property="to"/> <html:submit value="送信" /> </html:form> </body></HTML> ----------------------- と、結果表示のsuccess.jsp ----------------------- <%@ page contentType="text/html; charset=Shift_JIS" %> <HTML><body> mail success!!<BR/> メール送信成功!! </body></HTML> ----------------------- を追加し、上記のActionと、フォームのMailForm.java ----------------------- package test; import org.apache.struts.action.ActionForm; public class MailForm extends ActionForm { private String to; public void setTo(String val){ to = val; } public String getTo(){ return to; } } ----------------------- を追加し、struts-config.xmlのform-beansとaction-mappingsに ----------------------- <form-bean name="MailForm" type="test.MailForm"/> ----------------------- ----------------------- <action path="/Mail" type="test.MailAction" name="MailForm" scope="request" validate="false"> <forward name="success" path="/pages/success.jsp"/> </action> ----------------------- を追加しましただけです。 発生するエラーは、以下のようになっております。 ----------------------- 11:43:54,931 INFO [TilesRequestProcessor] Tiles definition factory found for re quest processor ''. 11:43:55,036 ERROR [Engine] StandardWrapperValve[action]: サーブレット action の Servlet.service()が例外を投げました javax.servlet.ServletException: サーブレットの実行により例外を投げました at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.jboss.web.tomcat.security.JBossSecurityMgrRealm.invoke(JBossSecur ityMgrRealm.java:220) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve .java:246) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.jboss.web.tomcat.tc4.statistics.ContainerStatsValve.invoke(Contai nerStatsValve.java:76) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java: 2417) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatche rValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit yAssociationValve.java:65) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 577) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:19 7) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :781) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce ssConnection(Http11Protocol.java:549) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java :605) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP ool.java:677) at java.lang.Thread.run(Thread.java:534) 11:43:55,046 ERROR [Engine] ----- Root Cause ----- java.lang.NoClassDefFoundError: javax/activation/DataSource at test.MailAction.execute(Unknown Source) at org.apache.struts.action.RequestProcessor.processActionPerform(Reques tProcessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja va:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:148 2) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.jboss.web.tomcat.security.JBossSecurityMgrRealm.invoke(JBossSecur ityMgrRealm.java:220) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve .java:246) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.jboss.web.tomcat.tc4.statistics.ContainerStatsValve.invoke(Contai nerStatsValve.java:76) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java: 2417) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatche rValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:172) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit yAssociationValve.java:65) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 577) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex t.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav a:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:19 7) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :781) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce ssConnection(Http11Protocol.java:549) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java :605) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP ool.java:677) at java.lang.Thread.run(Thread.java:534) ----------------------- 単純にメール送信機能を実現したいだけなのですが、Strutsとなにか競合してしまって この現象が起こっているのでしょうか?原因は何でしょうか? | ||||
|
投稿日時: 2004-03-01 12:11
必要なライブラリがない。もしくは CLASSPATH を通していない。 | ||||
|
投稿日時: 2004-03-01 12:27
JavaMailにはJAF(JavaBeans Activation Framework)と言うライブラリが別途必要です。
JavaMailのjarと同じところにJAFのjarも置いたらうまくいきませんか? | ||||
|
投稿日時: 2004-03-01 13:02
ふーばーさん、おばけさん、ありがとうございます。
JAF(activation.jar)はmail.jarと同じ場所においてあります。 さらに、環境変数CLASSPATHにもactivation.jarを設定しています。 envで見るとCLASSPATHは以下のようになっています。(一番最後に設定しています) CLASSPATH=:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/axi s.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/axis-ant .jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/commons-d iscovery.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/c ommons-logging.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF /lib/jaxrpc.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/li b/log4j-1.2.8.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/ lib/saaj.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/w sdl4j.jar:/usr/share/jboss-3.2.3/server/default/lib/activation.jar mail.jarはとくに設定していませんが問題無いようなので、activation.jarをmail.jar と同じ場所においておけば大丈夫だと思っていました。で、念のため、CLASSPATHにも設定 しています。 しかし、エラーの最初の方ばかり見て、 java.lang.NoClassDefFoundError: javax/activation/DataSource をあまり重視していませんでした。これはまさにJBossがこれを認識できてないって 事ですよね。設定をさぐってみます。 | ||||
|
投稿日時: 2004-03-01 13:37
なるほど。 ということは、CLASSPATHには設定しているがJBOSS上でクラスをロードできて いないという可能性もありますね。 この場合、私が良くやる手ですが、テスト用のJSPを作成してクラスローダの持ってる クラスパスを表示させる、というやり方が有効です。具体的には、 java.lang.System#getPropertiesでシステムプロパティを全部引きずり出して表示 させればOKです(HTMLテーブルを使って整形すれば見やすくて良いでしょう)。 | ||||
|
投稿日時: 2004-03-01 14:53
おばけさん、ありがとうございます。この方法は今後もすごく使えますね。
教えていただいたとおり、以下のようなjspを作成してクラスパスを見てみましたが どうもactivation.jarが参照できない状態のようでした。 --------------------------- <%@ page contentType="text/html; charset=Shift_JIS" import="java.util.*"%> <html><body><table> <% Properties properties = System.getProperties(); Enumeration keys = properties.keys(); while (keys.hasMoreElements()) { out.print("<tr>"); String key = (String)keys.nextElement(); String value = (String)properties.get(key); out.print("<td>" + key + "</td><td>" + value + "</td>"); out.print("</tr>"); } %> </table></body></html> --------------------------- ですので、jreが参照できるところにライブラリを置きました。 jre/lib/ext 以下にactivation.jarを入れました。そうするとうまく動作するようになりました。 本当はJBossの設定ファイル等に設定するのかもしれません。 ふーばーさん、おばけさん、ありがとうございました。 | ||||
|
投稿日時: 2004-03-01 17:37
解決されたようで、良かったです kojiさんが書かれたようなJSPが、まさに私の言ったものです。 この方法は便利ですので、これからも使ってみてください。 | ||||
|
投稿日時: 2004-03-02 14:00
おばけさん、これからも使わせてもらいます。
JBoss3.2.3を使っているのですが、普通はWEB-INF/libにjarを入れれば 良いと思ったので、jreの方を消してWEB-INF/libに入れてみましたら、 正常動作しました。この前は駄目だったのになぜだろう?で、今度はそれ も消してみました。それでも正常動作しました。JBossは再起動しても、 変更したクラスが更新されない現象が起こったり起こらなかったりしてい ます。JBossのキャッシュ機能かなにかが働いているようです。その辺 の問題で何が正しいんだかわからなくなってきました。 mail.jarとactivation.jarはjboss-3.2.3/server/default/lib 以下に最初から入っているのですが、それで駄目だったので上記場所に 入れたり消したりしていたのですが。。。 まぁ、WEB-INF/libとjre/lib/extの両方に入れておけば良いって事です かね。。。 ありがとうございました。 | ||||
