javax.mail.Sessions インスタンスを作成する、Tomcat 6.0 が提供する標準のリソース ファクトリを使用したいと考えています。JNDI リソースの HOW-TO チュートリアル で説明されているとおりです。
私の META-INF/context.xml は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true">
<Resource name="mail/Session"
auth="Container"
type="javax.mail.Session"
mail.smtp.host="smtp.gmail.com"
mail.smtp.port="587"
mail.smtp.auth="true"
mail.smtp.user="someone@gmail.com"
mail.smtp.password="secretpassword"
mail.smtp.starttls.enable="true"/>
</Context>
WEB-INF/web.xml の </webapps> の直前に、次の resource-ref があります。Web.xml が検証します。McDowell の方法を使用して検証しました。
<resource-ref>
<description>Resource reference to a factory for javax.mail.Session instances that may be used for sending electronic mail messages, preconfigured
to connect to the appropiate SMTP server.
</description>
<res-ref-name>mail/Session</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>
次のコード スニペットを使用して、javax.mail.Session オブジェクトにアクセスします。
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Session session = (Session)envCtx.lookup("mail/Session");
System.out.println("HERE smtp.user: " + session.getProperty("mail.smtp.user"));
サンプルアプリでテストしたところ、うまくいきました。残念ながら、同じコードを Struts アプリケーションに移動すると、上記の print ステートメントで NULL が返されます。mailer というシングルトン クラス (WEB-INF/classes フォルダーで定義されています) でコンテキスト ルックアップを行いますが、Struts アクション クラスでコンテキスト ルックアップを行うと同じ問題が発生します。
問題を見つけるために何が違うのかを考えてきました。私の struts アプリケーションの web.xml は、単純なアプリケーションの web.xml よりも複雑です。これには、セキュリティ制約、フィルター、および Struts サーブレット構成があります。サーブレット定義の直前に resource-ref を配置します。resource-ref が無視されているようです。
別の問題があります。javax.mail.Session に必要な mailapi.jar が myapp/WEB-INF/lib フォルダーにある場合、次のようになります。
java.lang.NoClassDefFoundError: javax/mail/Authenticator
$CATALINA_HOME/lib に入れると見つかります。
何か案は?ストラットと休止状態を使用します。多分それはそれと関係があります。
デバッグ
デバッグ属性をコンテキストに入れてデバッグしようとしました
<Context reloadable="true" debug="99" ...
しかし、私は面白いものを見ません。
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
01-feb-2009 17:39:09 org.apache.catalina.core.ApplicationContext log
私は試した:
Session session = (Session) initCtx.lookup("java:comp/env/mail/Session");
それ以外の:
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Session session = (Session)envCtx.lookup("mail/Session");
しかし、まだ NULL Session オブジェクトを取得しています。
部分解
Resource 要素を $CATALINA_HOME/conf/context.xml ファイル内に配置すると、機能します。