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:47:45)

Question

seasarにはいくつものサブプロダクトが有りますが、これらのアノテーションをまとめて書いたドキュメントはあるのでしょうか?


Answer

特にありません。
S2Containerのアノテーションリファレンスは、下記のページです。
http://s2container.seasar.org/ja/DIContainer.html#AnnotationReference


参考投稿
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: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からコンストラクタに渡す引数を設定したい

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

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

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

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)

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


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