[seasar-dotnet:467] 数字を含む引数をDaoのメソッドに渡すとJScriptEvaluateRuntimeExceptionが発生する
Akira Nishikata
nishikata.a @ buildsystem.jp
2007年 2月 27日 (火) 17:13:39 JST
お世話になっております。西方と申します。
S2Container.NET 1.2.8.0
S2Dao.NET 1.0.3.0
を使用しています。
現在、Daoインターフェースに以下のようなメソッドを定義しています。
--------------------------------------------------------------------------------
[Seasar.Dao.Attrs.Sql("select * from shop_OrderDetail /*BEGIN*/ where /*IF par1am.HasValue*/ order_detail_id = 1 /*END*/ /*END*/")]
IList SelectListByIncludeNumberParam(Nullables.NullableDecimal par1am);
--------------------------------------------------------------------------------
ここで上記メソッドを呼び出すとJScript.NETから下記のような例外が帰ってきます。
--------------------------------------------------------------------------------
Seasar.Framework.Exceptions.JScriptEvaluateRuntimeException: [ESSR0073]JScriptException occured, because self.GetArg('par1am') self.GetArg('.HasValue')
場所 Seasar.Framework.Util.JScriptUtil.Evaluate(String exp, Hashtable ctx, Object root)
場所 Seasar.Dao.Node.AbstractNode.InvokeExpression(String expression, ICommandContext ctx)
場所 Seasar.Dao.Node.IfNode.Accept(ICommandContext ctx)
場所 Seasar.Dao.Node.ContainerNode.Accept(ICommandContext ctx)
場所 Seasar.Dao.Node.BeginNode.Accept(ICommandContext ctx)
場所 Seasar.Dao.Node.ContainerNode.Accept(ICommandContext ctx)
場所 Seasar.Dao.Impl.SelectDynamicCommand.Execute(Object[] args)
場所 XXX.Dao.Allcommon.s2dao.S2DaoInterceptor.Invoke(IMethodInvocation invocation) 場所 S2DaoInterceptor.cs:行 107
場所 Seasar.Framework.Aop.Proxy.AopProxy.Invoke(IMessage msg)
場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
場所 XXX.Dao.Exdao.ShopOrderDetailDao.SelectListByIncludeNumberParam(NullableDecimal par1am)
場所 XXXTest.S2Dao.QueryAnnotationTest.SelectListByNumberIncludeParamTest() 場所 QueryAnnotationTest.cs:行 35
System.Reflection.TargetInvocationException: 呼び出しのターゲットが例外をスローしました。
場所 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
場所 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
場所 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
場所 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
場所 Seasar.Framework.Util.JScriptUtil.Evaluate(String exp, Hashtable ctx, Object root)
Microsoft.JScript.JScriptException: ';' が必要です。
eval code: 行 1 - エラー: ';' が必要です。
--------------------------------------------------------------------------------
どうやらDaoインターフェースの引数か、テーブル名に数字が含まれている場合、上記の例外が発生するようです。
問題の箇所は、Seasar.Dao.Node.ExpressionUtilの
--------------------------------------------------------------------------------
reSym = new Regex(@"^\s*(\-?\b*[_a-zA-Z.']+[_a-zA-Z0-9\[()\]]*)", RegexOptions.Compiled);
--------------------------------------------------------------------------------
の正規表現部分だと思うのですが、、
以上よろしくお願いいたします。
-----------------------------------------
株式会社ビルドシステム 業務システム開発部
西方 彬 <nishikata.a @ buildsystem.jp>
-----------------------------------------
seasar-dotnet メーリングリストの案内