現在、Spring + Struts + Hibernate の連携でBBSを作ろうと思ってるんですが、いろいろと設定が難しいっす。
●Daoについて
SpringのHibernateSupportクラスを継承したDaoを使ってるときのこと。
Bean定義ファイルに
<bean
id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
~~
</bean>
と記述して、XDocletにてDaoの定義ファイルを出力。
・・・
あれ? sessionFactory がないって言われた。。。
うーん、sessionFactoryは定義したし、Daoの設定はXDocletで出力できてるはずだし。。。
と、散々悩んだのですが、なんてこたぁない、
Daoのプロパティ sessionFactory にどの Beanを抽入するのか設定してなかった。
というわけで、クラス定義の前に
/**
* @author ueshin
* @spring.bean id = "categoryDao"
* @spring.property name = "sessionFactory" ref = "sessionFactory"
*/
という感じで、Daoにも忘れずにプロパティ設定してあげましょう。。。。orz
●必須ライブラリ?
さて、Daoの設定も終わったし、さて、起動!・・・・?
なにやら見知らぬ ClassNotFoundException。
javax/transaction/TransactionManager
が見当たらないらしい。
javaxってことはコアAPI?
javax.transactionっていうパッケージはあるけどそんなクラスないぞ?
アクセスログ表示Servletのときにこんなエラー出たっけ?
うーん、覚えがない。。。
っていうことは、Javaのインストールがうまくいってないのかなぁ。。。
あれ?でもやっぱしアクセスログ表示Servletはうまく動くぞ・・・?
などなど、いろいろと調べたんですが、結局、
jta.jar というのがHibernateで(?)必要らしい。
アクセスログ表示Servlet作ったときには、わけもわからず追加してたみたい。。。
他にも、dom4j-1.6.jar、ehcache-1.1.jar、cglib-nodep-2.1.jar あたり(バージョンナンバーはその都度)も必要みたい。
気をつけましょう。。。orz
●Struts設定ファイルにて
Hibernateで、Foreignキー経由で関連するオブジェクトを芋づる式に引っ張ってこれるようにしていたときのこと。
・Strutsを使うので、struts-config.xmlに、
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
ってな感じで設定。
・Actionにて、大元となるオブジェクトをHibernate経由で取得。
・jspにForwardして、その後の処理を。
という流れで設定していったのですが、芋づるが、セッション切断のため、とってこれずとのこと。うーん。
調べてみると、リクエストごとにHibernateセッションを保持できる設定を発見。
web.xml に、
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
を追加すれば、Spring設定ファイル、/WEB-INF/applicationContext.xmlを読み込んで、Hibernateセッションを管理してくれるとのこと。
これだ!と思って、設定してみたんですが、効果なし。。。うーん。
SpringAPIを探ってみると、
This context will automatically refer to the root WebApplicationContext (loaded by ContextLoaderListener/Servlet) as parent.
ContextLoaderListenerで読み込んだWebApplicationContextを自動的に参照する?
ということは、struts-config.xml での設定はどうなるんだべ?
どうやら、struts-config.xml での設定により、WebApplicationContextの設定を上書きして、2重ロードしていたっぽい。
で、Hibernateセッションも「リクエストごと」&「Struts処理内」の2つが読み込まれて、結果、Strutsで「芋づるの元」を読み込んだ時点でセッション破棄、その後はセッション切れてまっせ、というオチ。
では、回避方法は、というと、bean設定が空でもいいので、action-servlet.xml(StrutsのContextLoaderPlugInがデフォルトで読み込むBean設定ファイル)を設置してあげるのがいいみたい。
この場合、struts-config.xml は
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>
としましょう。
こうすれば、(何も設定してないけど、)action-servlet.xmlを読みにいってくれます。
applicationContext.xml を読み込むと、2重読み込みになり、action-servlet.xml がないと設定ファイルがないぞエラーとなるので、この方法が妥当かと。
うーん、やっぱし設定が慣れるまで大変そう。
でも、慣れれば後々強力なツールだろうから、がんばるべかねぇ。。。


コメントする