FAQ
S2Container †
diconファイルのタグ一覧ドキュメントはありますか †
S2サポーター? (2006-04-29 (土) 19:48:21)
Question
diconファイルに書くタグ一覧のようなドキュメントはあるのでしょうか?
Answer
diconファイルのタグは、サブプロダクトによって違わないので、S2Containerタグリファレンスになります。
http://s2container.seasar.org/ja/DIContainer.html
参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000431.html
http://ml.seasar.org/archives/seasar-user/2005-November/000452.html
バッチ更新処理に失敗したレコードを挿入することはできるか? †
S2サポーター? (2006-04-29 (土) 19:48:21)
Question
バッチ更新処理に失敗したレコードを挿入することはできるか?
Answer
アノテーションをまとめて書いたドキュメントはありますか †
S2サポーター? (2006-04-29 (土) 19:47:45)
Question
seasarにはいくつものサブプロダクトが有りますが、これらのアノテーションをまとめて書いたドキュメントはあるのでしょうか?
Answer
特にありません。個々のプロダクトのドキュメントを参照してください。
S2Containerのアノテーションリファレンスは、下記のページです。
http://s2container.seasar.org/ja/DIContainer.html#AnnotationReference
S2Dao Tigerのアノテーションリファレンスは、下記のページです。
http://s2dao.seasar.org/ja/tiger-annotation.html
参考投稿
http://ml.seasar.org/archives/seasar-user/2005-November/000431.html
http://ml.seasar.org/archives/seasar-user/2005-November/000452.html
まだ作りかけですが、2ちゃんねるに投稿されていた情報をもとにFAQ/S2DaoTigerを作りました。(218氏、221氏ありがとう)
コンポーネントの呼び出し元のjavaからコンストラクタに渡す引数を設定したい †
S2サポーター? (2006-04-29 (土) 19:27:07)
Question
S2Containerリファレンスを見て、diconファイルに記述したパラメータをコンポーネントの
コンストラクタに設定できるのはわかったのですが、コンポーネントの呼び出し元のjavaから
コンストラクタに渡す引数を設定したい場合どのようにすればよいのでしょうか?
たとえば以下のようなクラスをコンポーネントにしたい場合です。
public class StringUtil {
private String str;
public StringUtil(String str){
this.str = str;
}
public String[] split(String c){
return str.split(c);
}
}
Answer
ひがです。
今のところ、できません。
直接newしたオブジェクトでもDIできるようにするという研究はしていますが、
まだ実用化するには幾つか越えなければいけないハードルがあって難しそうです。
参考投稿
http://ml.seasar.org/archives/seasar-user/2005-December/000304.html
http://ml.seasar.org/archives/seasar-user/2005-December/000311.html
自動登録したクラスに共通の定義を適用する方法 †
S2サポーター? (2006-04-29 (土) 19:19:13)
Question
FileSystemComponentAutoRegisterで自動登録したコンポーネントのすべてに
共通のproperty、initMethodタグを適用したいのですが、可能でしょうか?
やりたいことは、JFrameを継承したクラスすべてに対しlayoutプロパティの
自動バインディングの無効化と、初期メソッドの呼び出しを行うことです。
<!-- ログイン画面 -->
<component name="loginForm" class="frame.LoginFrame">
<!-- layoutプロパティは自動バインディング対象外 -->
<property name="layout" bindingType="none"/>
<!-- 画面を中央に位置する -->
<initMethod>@util.SwingUtil @ setLocationCenter(#self)</initMethod>
</component>
上記のような定義をframe.*Frameクラスに対しすべて適用したいのです。
Answer
JFrameを継承したクラスを作成し、そこで、
@Binding(bindingType=BindingType.None)
public void setLayout(...)
@InitMethod
public void initialize() {
util.SwingUtil.setLocationCenter(this);
}
のようにアノテーションを記述します。
あとは、必要なクラスでこのクラスを継承するようにします。
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005125.html
http://ml.seasar.org/archives/seasar-user/2006-February/005138.html
Ver 2.3.4でcomponentにJFrameを指定すると例外が発生する †
S2サポーター? (2006-04-29 (土) 19:08:23)
Question
Ver 2.3.4 において dicon ファイルに JFrame およびその派生クラスを指定すると S2ContainerFactory.create 時に下
記例外が発生します。
JDK は 1.5 を使用しています。
■dicon ファイル
<components>
<component class="javax.swing.JFrame">
</component>
</components>
■例外
Exception occured at /components[1]/component[1]
org.seasar.framework.exception.IllegalAccessRuntimeException:
[ESSR0042]java.awt.Containerで不正なアクセスがありました。
理由はjava.lang.IllegalAccessException:
Class org.seasar.framework.util.FieldUtil can not access a
member of class java.awt.Container with modifiers ""
at org.seasar.framework.util.FieldUtil.get(FieldUtil.java:37)
〜(以下略)〜
Answer
この問題は、2.3.4以前で発生します。
2.3.5にて対応されました。
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005086.html
http://ml.seasar.org/archives/seasar-user/2006-February/005087.html
S2Tx機能を使用したテーブルの行ロックが、テーブルロックになってしまう †
S2サポーター? (2006-04-29 (土) 19:06:33)
Question
○環境
・JDK:1.4.2_03
・S2Container:2.2.10
・S2Dao:1.0.27
・DB:Microsoft SQL Server
○現象
『トランザクション属性にj2ee.requiredTxをAspectしたクラスから、
テーブルの行ロックをかけようとしたところ、行ロックではなく、テーブルロックになる。』
テーブルの行ロックをかけるため下記SQLを実行し、
「SQL Server Enterprise Manager」からロック状況を確認したところ、
テーブル内の全レコードに対して更新ロックがかかります。
SELECT * FROM テーブル名 with(UPDLOCK,ROWLOCK)
WHERE aaaa = 'aa';
※aaaa:プライマリキー
S2Tx機能をはずした状態
(BEGIN TRANSACTION、COMMIT TRANSACTIONを使用した場合)で同一SQLを実行したところ、
対象行にのみ更新ロックがかかっていることことから、
S2Tx機能に原因があるのではと考えています。
Answer
S2Txは、ロックには関与していないので、
with(UPDLOCK,ROWLOCK)を使うには、明示的に、
BEGIN TRANSACTION、COMMIT TRANSACTIONを行う必要がある
ということだと思います。
XAに対応したJDBC Driverならそっちを使ってみるのも手です。
j2ee.diconのxaDataSourceの部分をそのXA Driverの物に替えればよいです。
ただ、まともなXA Driverを見たことが余り無いので、期待できないかも。
S2Txは、JTAの仕様に合わせて、XAResourceのメソッドを呼び出しています。
dbcp.implのDBXAResourceのdoBegin, doCommitなどを見れば、
実際に何が行われているのかが分かります。
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005047.html
http://ml.seasar.org/archives/seasar-user/2006-February/005048.html
S2.3.4のセットアップに必要なjarは「geronimo-spec-jta-1.0.1B-rc4.jar」と「jta.jar」のどっち? †
S2サポーター? (2006-04-29 (土) 18:44:45)
Question
ドキュメントのセットアップ http://s2container.seasar.org/ja/setup.html
を見ると、 Tomcat等 で動かすには geronimo-spec-jta-1.0.1B-rc4.jar が必要と書いてあるのですが、
S2.3.4.zip には geronimo-spec-jta-1.0.1B-rc4.jar 含まれてなく、ドキュメントにはない従来通り
jta.jar が入っていています。
jta.jar で動作はしますが、どういう事でしょうか?
Answer
オンラインのドキュメントは一部 S2.4 のものが紛れ込んでいます.
すみません.
S2.4 では従来の jta.jar (Sun が配布している JTA 1.0.1B のもの) ではなく
Geronimo のものになりますが,S2.3 では jta.jar に読み替えてください.
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-January/000172.html
http://ml.seasar.org/archives/seasar-user/2006-January/000174.html
instance属性でrequestを設定するとnullでエラーになる。 †
S2サポーター? (2006-04-29 (土) 18:28:30)
Question
instance属性にrequestを設定して実行すると
「[ESSR0007]requestはnullあるいは空であってはいけません」
とエラーがでます。
Answer
あるコンポーネントAを利用したいコンポーネントBは、Aより
ライフサイクルが短いもしくは同じである必要があります。
今回のケースだとinstance属性がrequestのコンポーネントを
利用するコンポーネントのinstance属性は、prototypeもしくは
requestにする必要があります。
Interceptorを使ってごにょごにょする方法もありますが、
上記が基本です。
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-March/005247.html
http://ml.seasar.org/archives/seasar-user/2006-March/005249.html
さらに文法的に <component .... instance="request" >
と書いてあると同様のエラーになります。かならず
instance="request">
と空白を入れずにクローズしてください。Seasar2全般に
XML文法的にはセーフでも、エラーになることが多いので注意してください。
というか、diconは公式サンプルをコピペしないと痛い目にあいます。
AutoRegisterの正しい記述順は? †
S2サポーター? (2006-04-29 (土) 17:54:07)
Question
設定ファイルの AutoRegister の記述順についての質問です。
使用している Seasar のバージョンは 2.3.4 です。
ウェブサイトに
コンポーネントの自動登録の設定よりも後に、
アスペクトの自動登録の設定を記述する必要があります。
とありますが、明示的に登録したコンポーネントと
自動登録されたアスペクトの記述順については
特に触れられていません。
Foo <| - - FooImpl ----> Bar <| - - BarImpl
という構成で、以下の設定ファイルを使用した場合、
(a)、(b)、(c) の順に記述すると、Foo、Bar ともアスペクトが適用されますが、
(a)、(c)、(b) の順に記述すると、Foo しかアスペクトが適用されません。
直感的には、(a)、(c)、(b) の順に記述した場合、Foo、Bar ともアスペクトが
適用されると期待したのですが、仕様のご確認をお願いします。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC
"-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
<include path="aop.dicon"/>
<!-- (a) -->
<component
class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
<initMethod name="addReferenceClass">
<arg>@org.seasar.framework.misc.Foo @ class</arg>
</initMethod>
<initMethod name="addClassPattern">
<arg>"org.seasar.framework.misc"</arg>
<arg>"F.*Impl"</arg>
</initMethod>
</component>
<!-- (b) -->
<component
class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">aop.traceInterceptor</property>
<initMethod name="addClassPattern">
<arg>"org.seasar.framework.misc"</arg>
<arg>".*Impl"</arg>
</initMethod>
</component>
<!-- (c) -->
<component class="org.seasar.framework.misc.BarImpl"/>
</components>
Answer
(a),(c),(b) の順に記述すると,(b) の AspectAutoRegister が
アスペクトの自動登録を行う前に (c) のコンポーネントが
初期化されてしまうため,アスペクトが適用されません.
(a),(b),(c) の順に記述してください.
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-March/005316.html
http://ml.seasar.org/archives/seasar-user/2006-March/005318.html
S2TestCaseのreadXls()で、オートフィルタが設定されているExcelファイルを読み込むと例外が発生 †
Question
S2TestCaseのreadXls()で、オートフィルタが設定されているExcelファイルを読み込むと例外が発生します。
[java] Caused by: org.apache.poi.hssf.record.RecordFormatException: Unable to construct record instance, the following exception occured: null
[java] at org.apache.poi.hssf.record.RecordFactory.createRecord(RecordFactory.java:237)
[java] at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:160)
[java] at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:163)
[java] at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:210)
[java] at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:191)
[java] at org.seasar.extension.dataset.impl.XlsReader.<init>(XlsReader.java:73)
[java] at org.seasar.extension.dataset.impl.XlsReader.<init>(XlsReader.java:68)
Answer
Excelファイルの読み込みに使用している Apache Jakarta プロジェクトの POI が原因のようです.
Seasr2 に同梱しているのは poi-2.5.1-final-20040804.jar ですが,開発版として提供されている poi-3.0-alpha2-20060616.jar に置き換えると例外が発生しなくなります.
poi-3.0-alpha2-20060616.jar は以下からダウンロードしてください.
S2DaoTestCaseのreadXlsWriteDb()で、boolean型の値を含むデータINSERTで例外発生 †
S2サポーター? (2006-04-29 (土) 16:57:47)
Question
これまで次のような構成にて開発を行っていたのを
Answer
s2containerを修正しました、次のバージョンから反映されます。
# [Seasar-user:3182]での修正が影響していたようです。
修正ぶんのソースを添付しますので、お急ぎでしたらお使いください。
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-April/005438.html
http://ml.seasar.org/archives/seasar-user/2006-April/005439.html
Seaser2.3.7のHotswap機能を使うと、IllegalArgumentExceptionが発生する †
S2サポーター? (2006-04-29 (土) 16:14:14)
Question
- 環境
- JDK1.5.0.06
- Tomcat5.5.15
- Seaser2.3.7
- S2Dao1.0.32
- WebWork2.2.1
Seaserを2.3.4を使用していた時、Hotswap機能を使用していました。
アプリの設定を何も変更をせずに2.3.7にバージョンアップさせました。
すると、下記エラーがはかれるようになってしまいました。
java.lang.IllegalArgumentException: repeated interface:
org.seasar.framework.util.ClassTraversal$ClassHandler
at java.lang.reflect.Proxy.getProxyClass(Unknown Source)
at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
at org.seasar.framework.hotswap.HotswapProxy.create(HotswapProxy.java:50)
at org.seasar.framework.container.deployer.SingletonComponentDeployer.assemble(SingletonComponentDeployer.java:71)
at org.seasar.framework.container.deployer.SingletonComponentDeployer.deploy(SingletonComponentDeployer.java:51)
at org.seasar.framework.container.deployer.SingletonComponentDeployer.init(SingletonComponentDeployer.java:96)
at org.seasar.framework.container.impl.ComponentDefImpl.init(ComponentDefImpl.java:283)
at org.seasar.framework.container.impl.S2ContainerImpl.init(S2ContainerImpl.java:361)
at org.seasar.framework.container.factory.SingletonS2ContainerFactory.init(SingletonS2ContainerFactory.java:51)
- Hotswap機能は2.3.4の時の設定のままでは、2.3.7では動作しないでしょうか?
- 何か設定を変更しなければならないのでしょうか?
Answer
S2.3.7 で行った以下の修正のバグです.
この現象は,継承関係にある複数のクラスが同じインタフェースを
実装している場合に発生します.
public class Foo implements Runnable {...}
public class Bar extends Foo implements Runnable {...}
org.seasar.framework.hotswap.HotswapProxy#getInterfaces() を以下のように修正してください.
static Class[] getInterfaces(Class targetClass) {
final Set interfaces = new HashSet();
Collections.addAll(interfaces, targetClass.getInterfaces());
if (targetClass.isInterface()) {
interfaces.add(targetClass);
} else if (!targetClass.equals(Object.class)) {
Collections.addAll(interfaces, getInterfaces(targetClass
.getSuperclass()));
}
return (Class[]) interfaces.toArray(new Class[interfaces.size()]);
}
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-April/005405.html
http://ml.seasar.org/archives/seasar-user/2006-April/005408.html
コンポーネントや名前空間の名前にハイフン(-)は使えますか †
Question
Component名に、"-"を使うことは可能でしょうか。
"-"を含めた場合、"-"から前までがcomponent名として検索されているようで、コンポーネントが見つからないエラーになります。
Answer
できません.
コンポーネント名は Java の識別子として扱われます.
つまり,Java の変数名などと同じ規則に従います.
components 要素の namespace 属性も同様です.
タグリファレンスの component タグ (の name 属性) のところに書いてあります.
http://s2container.seasar.org/ja/DIContainer.html#componentTag
参考投稿
http://ml.seasar.org/archives/seasar-user/2006-June/005709.html
http://ml.seasar.org/archives/seasar-user/2006-June/005717.html
S2JDBCで"<"をSQLに含めると例外が出る †
Question
下記のSQLをS2JDBCで利用
するとSAXRuntimeException:で落ちてしまいます。
select a,b from table1 where b>=? and b<=?
または
select a,b from table1 where b>? and b<?
Answer
sql部分をCDATAセクションにすればOKだと思います。
参考投稿
http://ml.seasar.org/archives/seasar-user/2005-August/000746.html のスレッド。
別ファイルの設定情報をdiconで使用したい †
Answer
HOT deploy時にソースコードを編集するとコンテキストのリロードが実行されてしまう †
Answer
コンテキスト設定で、reloadableがfalseになっているか確認してください。
reloadable="false"
- Sysdeo Eclipse Tomcat Launcher pluginで実行している場合
- プロジェクトを選択し、[Properties]をクリック
- [Tomcat] を選択
- [このコンテキストの再読込を可能にする]のチェックを外す
- プロジェクトを選択し、[Tomcat プロジェクト] -> [Tomcat のコンテキストを更新]
- コンテキストを更新し直さないと設定が有効になりません。
HOT deploy時にjava.reflect.*を使用する外部ライブラリが上手く動作しない †
Answer
COOL deploy時にはこの問題は発生しません。
HOT deploy時にSeasar2で管理されたクラス(コンポーネント)に対してjava.reflect.*を使用する場合、Seasar2が提供するクラスローダ(HotdeployClassLoader)を使用しないとクラスを操作できません。
外部ライブラリにクラスローダを設定するAPIがある場合、下記のコードでクラスローダを取得し、設定することで動作します。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
public static List getResultList(String sql, List list, Map variables) {
Query query = new Query();
query.setClassLoader(Thread.currentThread().getContextClassLoader());
try {
query.parse(sql);
if (variables != null) {
Set keySet = variables.keySet();
for (Object key : keySet) {
query.setVariable(String.valueOf(key), variables.get(key));
}
}
return query.execute(list).getResults();
} catch (QueryParseException e) {
e.printStackTrace();
} catch (QueryExecutionException e) {
e.printStackTrace();
}
return null;
}
HOT deploy時にThrowsInterceptorを継承したInterceptorが期待した通りに動作しない †
Answer
COOL deploy時にはこの問題は発生しません。
本問題は、S2Container 2.4.0 rc 1時点の問題です。
将来的に他の解決方法が提供されるかもしれません。
2006-08-29追記: 現在のtrunk上では、Creatorの仕様変更に伴いdiconファイルの設定方法が異なるためご注意ください。
S2Container正式リリース後に本FAQを訂正もしくは修正いたします。
- クラス: org.example.interceptor.ActionThrowsInterceptor
- extends org.seasar.framework.aop.interceptors.ThrowsInterceptor
- rootPackageName: org.example
diconファイルでActionThrowsInterceptorを明示的にコンポーネント定義をしている場合、その定義を削除し、AspectCustomizerで名前(actionThrowsInterceptor)だけを指定してください。ActionThrowsInterceptorは、Creatorにより登録されるため、明示的に定義する必要はありません。
HOT deploy時に明示的に定義されていると、登録時と実行時のクラスローダが異なるため、正常に動作しません。
S2JDBCで、Javaの型にたいしてResultSetのどのメソッドが呼ばれるかの対応表はありますか? †
デフォルトでは以下のとおりになります。
Javaの型 | 呼ばれるメソッド |
String | setString/getString |
char | setString/getString |
Character | setString/getString |
short | setShort/getObject |
Short | setShort/getObject |
int | setInt/getObject |
Integer | setInt/getObject |
long | setLong/getObject |
Long | setLong/getObject |
float | setFloat/getObject |
Float | setFloat/getObject |
Double | setDouble/getObject |
double | setDouble/getObject |
BigDecimal | setBigDecimal/getBigDecimal |
java.sql.Date | setDate/getDate |
java.sql.Time | setTime/getTime |
java.util.Date | setTimestamp/getTimestamp |
Timestamp | setTimestamp/getTimestamp |
Calaendar | setTimestamp/getTimestamp |
byte[] | setBinaryStream/getBlob |
InputStream | setBinaryStream/getBinaryStream |
boolean | setBoolean/getObject |
Boolean | setBoolean/getObject |