この内容は修正されました。
修正後はこちら
Struts2 + Spring + Slim3の連携に挑戦。
ソースの省略はしません。
今回と次回で、簡単なサンプルを動作させるまでの手順を載せます。
- Slim3の新規プロジェクト作成
- まず最初に、EclipseのSlim3プラグインを使用してSlim3の新規プロジェクトを作成します。
プロジェクト名とルートパッケージ Project name s3sample Root Package com.brightgenerous.s3.sample.data - 不要なファイルを削除しておきます。
削除するファイルとディレクトリ /src/application_en.properties /src/application_ja.properties /war/css /war/ktrwjr /war/common.jsp
- Jarファイル追加
- 以下のjarファイルを「war/WEB-INF/lib」に追加します。
追加するjarファイル aopalliance-1.0 commons-beanutils-1.7.0 commons-digester-2.0 commons-fileupload-1.2.1 commons-io-1.3.2 commons-lang-2.3 commons-logging-1.0.4 commons-validator-1.3.1 freemarker-gae-pre3 javassist ognl-3.0 spring-aop spring-beans spring-context spring-core spring-tx spring-web struts2-convention-plugin-2.2.1.1 struts2-core-2.2.1.1 struts2-spring-plugin-2.2.1.1 xwork-core-2.2.1.1 freemarker-gae-pre3は、gae用のfreemarkerです。
Springは2.5を使用します。
- web.xml
- 「war/WEB-INF」に配置するweb.xmlファイルです。
-
slim3.rootPackage com.brightgenerous.s3.sample.data contextConfigLocation classpath:applicationContext*.xml struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter actionPackages com.brightgenerous.s3.sample.action struts2 /* org.springframework.web.context.ContextLoaderListener com.brightgenerous.s3.sample.gae.GaeInitListener - Slim3の新規プロジェクトを作成して生成されるweb.xmlの内容のほとんどを消すことになります。
「com.brightgenerous.s3.sample.gae.GaeInitListener」は、独自に実装するクラスです。ソースは「実装するクラス」にて後述します。
- applicationContext.xml
- 「classpath:applicationContext*.xml」(src直下)に配置します。
-
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly transactionInterceptor *ServiceImpl - 「transactionManager」のみ用意してやれば他はそのまま使えます。なかなかナイスな設計です。
「com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor」、「com.brightgenerous.s3.sample.gae.Slim3TransactionManager」については、後述です。
- 実装するクラス
- 1.com.brightgenerous.s3.sample.gae.GaeInitListener
-
package com.brightgenerous.s3.sample.gae; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import ognl.OgnlRuntime; public class GaeInitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener { @Override public void contextInitialized(ServletContextEvent sce) { OgnlRuntime.setSecurityManager(null); } @Override public void contextDestroyed(ServletContextEvent arg0) { } @Override public void sessionCreated(HttpSessionEvent arg0) { } @Override public void sessionDestroyed(HttpSessionEvent arg0) { } @Override public void attributeAdded(HttpSessionBindingEvent arg0) { } @Override public void attributeRemoved(HttpSessionBindingEvent arg0) { } @Override public void attributeReplaced(HttpSessionBindingEvent arg0) { } }
- OGNLのセキュリティマネージャがなんとかかんとか...理由については、詳しく調べていません。
- 2.com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor
-
package com.brightgenerous.s3.sample.gae; public class GaeFixInternalPersistenceAnnotationProcessor { public GaeFixInternalPersistenceAnnotationProcessor() { } }
- 「java.lang.NoClassDefFoundError」を回避することだけが目的です。
- 3.com.brightgenerous.s3.sample.gae.Slim3TransactionManager
-
package com.brightgenerous.s3.sample.gae; import java.io.Serializable; import org.slim3.datastore.Datastore; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.support.AbstractPlatformTransactionManager; import org.springframework.transaction.support.DefaultTransactionStatus; import com.google.appengine.api.datastore.Transaction; public class Slim3TransactionManager extends AbstractPlatformTransactionManager { private static final long serialVersionUID = 3423679590583692519L; @Override protected void doBegin(Object x_arg0, TransactionDefinition x_arg1) throws TransactionException { TransactionObject transactionObject = (TransactionObject) x_arg0; transactionObject.p_transaction = Datastore.beginTransaction(); } @Override protected void doCommit(DefaultTransactionStatus x_arg0) throws TransactionException { TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction(); transactionObject.p_transaction.commit(); } @Override protected Object doGetTransaction() throws TransactionException { return new TransactionObject(); } @Override protected void doRollback(DefaultTransactionStatus x_arg0) throws TransactionException { TransactionObject transactionObject = (TransactionObject) x_arg0.getTransaction(); transactionObject.p_transaction.rollback(); } private class TransactionObject implements Serializable { private static final long serialVersionUID = -8353097480608667182L; Transaction p_transaction; } }
- 「org.springframework.jdbc.datasource.DataSourceTransactionManager」の実装を参考にして、Slim3用に簡単に対応させています。
このクラスのみ自作です。間違い等あれば指摘していただけるとありがたいです。
以上でStruts2 + Spring + Slim3の設定は完了です。
次回は、このフレームワークを使用して簡単なサンプルを書いてみます。
0 件のコメント:
コメントを投稿