この内容は修正されました。
修正後はこちら
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ファイルです。
-
- <!--xml version="1.0" encoding="utf-8"?-->
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
- <context-param>
- <param-name>slim3.rootPackage</param-name>
- <param-value>com.brightgenerous.s3.sample.data</param-value>
- </context-param>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:applicationContext*.xml</param-value>
- </context-param>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- <init-param>
- <param-name>actionPackages</param-name>
- <param-value>com.brightgenerous.s3.sample.action</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <listener>
- <listener-class>com.brightgenerous.s3.sample.gae.GaeInitListener</listener-class>
- </listener>
- </web-app>
- Slim3の新規プロジェクトを作成して生成されるweb.xmlの内容のほとんどを消すことになります。
「com.brightgenerous.s3.sample.gae.GaeInitListener」は、独自に実装するクラスです。ソースは「実装するクラス」にて後述します。
- applicationContext.xml
- 「classpath:applicationContext*.xml」(src直下)に配置します。
-
- <!--xml version="1.0" encoding="utf-8"?-->
- <!--xml version="1.0" encoding="UTF-8" ?-->
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <context:annotation-config></context:annotation-config>
- <context:component-scan base-package="com.brightgenerous.s3.sample.action"></context:component-scan>
- <bean id="org.springframework.context.annotation.internalPersistenceAnnotationProcessor" class="com.brightgenerous.s3.sample.gae.GaeFixInternalPersistenceAnnotationProcessor">
- </bean>
- <bean id="transactionManager" class="com.brightgenerous.s3.sample.gae.Slim3TransactionManager">
- </bean>
- <bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
- <property name="properties">
- <props>
- <prop key="regist*">PROPAGATION_REQUIRED</prop>
- <prop key="update*">PROPAGATION_REQUIRED</prop>
- <prop key="delete*">PROPAGATION_REQUIRED</prop>
- <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
- </props>
- </property>
- </bean>
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager"></property>
- <property name="transactionAttributeSource" ref="transactionAttributeSource"></property>
- </bean>
- <bean id="beanNameAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- <property name="beanNames">
- <list>
- <value>*ServiceImpl</value>
- </list>
- </property>
- </bean>
- </beans>
- 「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 件のコメント:
コメントを投稿