[[FAQ]]

*S2Container [#q34208f8]

#contents

**diconファイルのタグ一覧ドキュメントはありますか [#r1f58c75]
>[[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~

//



**アノテーションをまとめて書いたドキュメントはありますか [#ebe5b90a]
>[[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氏ありがとう)
//



**複数のアスペクトを自動登録したい [#j42b10c2]
>[[S2サポーター]] (2006-04-29 (土) 19:34:12)~
~
''Question''~
over 2.3のAspectAutoRegisterを使って、自動登録へ切り替えようかと画策しております。~
~
ソースを拝見させていただきましたが、複数のアスペクトを自動登録することはできないのでしょうか?~
~
従来の記述で言えば、~
 <component ...>
   <aspect>aop.traseInterceptor</aspect>
   <aspect>dao.interceptor</aspect>
 </component>
のような場合です。~
~

~
''Answer''~
InterceptorChain を使うのがよいかと思います.~
~
 <component name="traceAndDao" class="org.seasar.framework.aop.interceptors.InterceptorChain">
     <initMethod name="add">aop.traceInterceptor</initMethod>
     <initMethod name="add">dop.interceptor</initMethod>
 </component>
~
としておいて,traceAndDao を AspectAutoRegister で設定.~
~
''参考投稿''~
http://ml.seasar.org/archives/seasar-user/2005-October/000618.html~
http://ml.seasar.org/archives/seasar-user/2005-October/000619.html~

//



**コンポーネントの呼び出し元のjavaからコンストラクタに渡す引数を設定したい [#w1e7f6ef]
>[[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~

//



**自動登録したクラスに共通の定義を適用する方法 [#o2b4363d]
>[[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を指定すると例外が発生する [#xdf5a1ba]
>[[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機能を使用したテーブルの行ロックが、テーブルロックになってしまう [#m9e8c038]
>[[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」のどっち? [#qf744871]
>[[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でエラーになる。 [#uafdce8e]
>[[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~

//



**AutoRegisterの正しい記述順は? [#g8a39cb6]
>[[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~

//



**S2DaoTestCaseのreadXlsWriteDb()で、boolean型の値を含むデータINSERTで例外発生 [#z97b2495]
>[[S2サポーター]] (2006-04-29 (土) 16:57:47)~
~
''Question''~
~
これまで次のような構成にて開発を行っていたのを~
~
-S2Container : 2.2.10~
-S2Dao: 1.0.28~
-DB: SQL Server 2000~
~
最近次のように変更したところ、~
~
-S2Container : 2.3.7~
-S2Dao: 1.0.32~
~
S2DaoTestCaseのreadXlsWriteDb()で、boolean型の値(テーブルはbit型)を含む~
データのINSERTの際に、例外が発生するようになってしまいました。~
~
 [SQLServer]構文エラー。nvarchar 値 'false' から bit データ型に変換できませんでした。
~
INSERT文のログ出力を見ると、今までは、trueとなっていたのが、'true'となっている~
ようです。何か回避方法などありますでしょうか?~
~
また、似たような件で[Seasar-user:1479]にて何か変更がされているようですが、~
何か関係ありますでしょうか。~
~

>
''Answer''~
~
s2containerを修正しました、次のバージョンから反映されます。~
# [Seasar-user:3182]での修正が影響していたようです。~
~
[[修正ぶんのソース:http://ml.seasar.org/archives/seasar-user/2006-April/005439.html]]を添付しますので、お急ぎでしたらお使いください。~
~
~
''参考投稿''~
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が発生する [#b001b603]
>[[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

**コンポーネントや名前空間の名前にハイフン(-)は使えますか [#sdedd7e0]
>
~
''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に含めると例外が出る [#p0f683e6]

''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で使用したい [#cb95d153]

''Answer''

- http://ml.seasar.org/archives/seasar-user/2006-August/006175.html
- http://ml.seasar.org/archives/seasar-user/2006-August/006180.html

**HOT deploy時にソースコードを編集するとコンテキストのリロードが実行されてしまう [#e4624d2e]

''Answer''

コンテキスト設定で、reloadableがfalseになっているか確認してください。
 reloadable="false"

- Sysdeo Eclipse Tomcat Launcher pluginで実行している場合
++ プロジェクトを選択し、[Properties]をクリック
++ [Tomcat] を選択
++ [このコンテキストの再読込を可能にする]のチェックを外す
++ プロジェクトを選択し、[Tomcat プロジェクト] -> [Tomcat のコンテキストを更新]
--- コンテキストを更新し直さないと設定が有効になりません。

**HOT deploy時にjava.reflect.*を使用する外部ライブラリが上手く動作しない [#nc5381c0]

''Answer''

COOL deploy時にはこの問題は発生しません。

HOT deploy時にSeasar2で管理されたクラス(コンポーネント)に対してjava.reflect.*を使用する場合、Seasar2が提供するクラスローダ(HotdeployClassLoader)を使用しないとクラスを操作できません。

外部ライブラリにクラスローダを設定するAPIがある場合、下記のコードでクラスローダを取得し、設定することで動作します。

 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

- JoSQLを使用する場合の実装例

     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が期待した通りに動作しない [#l8621c0e]

''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時に明示的に定義されていると、登録時と実行時のクラスローダが異なるため、正常に動作しません。

-aop.dicon (抜粋)
 ...
 <!-- 明示的に定義してあるものを無効にします
 <component name="actionThrowsInterceptor"
     class="org.example.interceptor.ActionThrowsInterceptor"/>
 -->
 ...

-example-customizer.dicon (抜粋)
 ...
 <component name="actionAspectCustomizer" class="org.seasar.framework.container.autoregister.AspectCustomizer">
     <property name="interceptorName">"actionThrowsInterceptor"</property>
 </component>
 ...
 <component name="actionCustomizer" class="org.seasar.framework.container.autoregister.CustomizerChain">
     ...
     <initMethod name="addCustomizer"><arg>actionAspectCustomizer</arg></initMethod>
 </component>

-example-cooldeploy.dicon (抜粋)
 ...
     <component class="org.seasar.framework.container.cooldeploy.creator.InterceptorCoolCreator"/>
     <component name="project" class="org.seasar.framework.container.cooldeploy.impl.CoolProjectImpl">
          <property name="rootPackageName">"org.example"</property>
     </component>
     <component class="org.seasar.framework.container.cooldeploy.CoolComponentAutoRegister">
          <initMethod name="addProject">
               <arg>project</arg>
          </initMethod>
     </component>
 ...

-example-hotdeploy.dicon (抜粋)
 ...
     <component class="org.seasar.framework.container.hotdeploy.creator.InterceptorOndemandCreator"/>
     <component class="org.seasar.framework.container.hotdeploy.OndemandBehavior">
          <initMethod name="addProject">
               <arg>
                    <component name="project" class="org.seasar.framework.container.hotdeploy.impl.OndemandProjectImpl">
                         <property name="rootPackageName">"org.example"</property>
                    </component>
               </arg>
          </initMethod>
     </component>
 ...

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS