[seasar-dev:606] [S2Dao.NET]正常なのにWarnログが発生する。
kubo
jazzflute @ mbn.nifty.com
2006年 11月 16日 (木) 18:11:22 JST
久保です。
.NETチームの皆様方へ
実は業務の方で、S2Dao.NETで「正常なのにWarnログが発生する」という
現象を確認しています。ちょっと優先度を下げていたのですが、
夜間バッチとかで大量のWARNログが発生してしまうので、どうにかしたい
と考えておりました。
現象と原因を追究してみました。
現象
A. 埋め込み変数コメントで{.}つなぎを使うと発生{dto.xxx}
B. IFコメントで{.}つなぎを使うと発生{dto.xxx}
原因
A. EmbeddedValueNodeにて、GetArgType()を呼び出しているが、
その引数の値が、"dto"ではなく、"dto.xxx"になってしまっている。
当然そんなArgTypeはないので、WARNが出力される。
なぜ、"dto.xxx"になっているかと言うと、EmbeddedValueNodeの
Splitの引数が、本来は{.}ドットであるべきところが、{,}カンマに
なってしまっているからである。
B. CommandContextImpl.GetArg()にて、値が取得できなかった場合に
WARNが出力される。しかし、IFコメント的には、{!= null}と判定
したいので、その値がNULLになるのは正常である。
CommandContextImpl.GetArg()で、nullを返すときに
WARNログを出力するのは、Java版でも同様。
しかし違うのは、JavaではIFコメントをOGNLで解析していて、
C#ではJScriptで解析している。C#の場合は、JScript内部で
このGetArg()を呼び出してしまう。
解決方法
A. EmbeddedValueNodeの処理をBindVariableNodeとほぼ同じようにする。
(修正するctx.AddSqlの部分の引数の数だけが違う)
そもそもGetArg()で取得したいValueが取得できてしまうので
GetArgType()を呼び出す必要がない。
→GetArg()内で、Splitして解析しているため
B. 不明。
CommandContextImpl.GetArg()は、共通Objectなので、
WARNを出力するか否かは、呼び出し側の責任する?
→CommandContextImpl内でWARNは出力せず、
BindVariableNodeやEmbeddedValueNodeなどが、
戻り値で判断してWARNを出す。
とりあえずは、「A」はローカルで修正してテストも通り、
業務においてバッチを実行してもWARNログが出力されないことを確認しました。
その他正常に動作しております。
まず「A」に関して、このような修正でよろしいでしょうか?
そして「B」に関して、どうしましょうか?
--
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
kubo <jazzflute @ mbn.nifty.com>
jflute <http://d.hatena.ne.jp/jflute>
株式会社ビルドシステム <http://www.buildsystem.co.jp>
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
Seasar-dev メーリングリストの案内