[Seasar-user:16184] 【S2JDBC】S2AbstractService#findByConditionでStringIndexOutOfBoundsException
muramoto
[E-MAIL ADDRESS DELETED]
2008年 10月 30日 (木) 13:49:31 JST
お世話になります。村本です。
S2JDBC(2.4.31)にて障害と思われるものを検出いたしましたので報告いたします。
現象:
S2AbstractService#findByCondition(BeanMap conditions)にて、
BeanMapに値がnullの要素を1つだけputした場合に
StringIndexOutOfBoundsExceptionがスローされる。
以前(2.4.28)は上記の場合でも正常に動作しましたので、
障害と判断しました。
少し調べてみたところ、
値がnullのためWHERE句(WhereClause)にaddされなくて
WHERE句が""(空文字)にもかかわらず、
AutoSelectImpl#prepareConditions()で
" where "分だけ除こうとsubstringしていることが原因のようです。
SVNの「3930」の修正に当たります。
お手数ですが、修正お願いいたします。
念のためスタックトレースを張っておきます。
以上よろしくお願いいたします。
以下 スタックトレース
java.lang.StringIndexOutOfBoundsException: String index out of range: -7
at java.lang.String.substring(String.java:1768)
at java.lang.String.substring(String.java:1735)
at org.seasar.extension.jdbc.query.AutoSelectImpl.prepareConditions(AutoSelectImpl.java:971)
at org.seasar.extension.jdbc.query.AutoSelectImpl.prepare(AutoSelectImpl.java:356)
at org.seasar.extension.jdbc.query.AbstractSelect.getResultList(AbstractSelect.java:169)
at com.fjh.struts.service.AbstractEntityService.findByCondition(AbstractEntityService.java:126)
at com.fjh.struts.service.SsoService$$EnhancedByS2AOP$$1b0bdc8.$$findByCondition$$invokeSuperMethod$$(SsoService$$EnhancedByS2AOP$$1b0bdc8.java)
at com.fjh.struts.service.SsoService$$EnhancedByS2AOP$$1b0bdc8$$MethodInvocation$$findByCondition6.proceed(MethodInvocationClassGenerator.java)
at org.seasar.extension.tx.DefaultTransactionCallback.execute(DefaultTransactionCallback.java:58)
at org.seasar.extension.tx.adapter.JTATransactionManagerAdapter.required(JTATransactionManagerAdapter.java:65)
at org.seasar.extension.tx.RequiredInterceptor.invoke(RequiredInterceptor.java:41)
at com.fjh.struts.service.SsoService$$EnhancedByS2AOP$$1b0bdc8$$MethodInvocation$$findByCondition6.proceed(MethodInvocationClassGenerator.java)
at org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:73)
at com.fjh.struts.service.SsoService$$EnhancedByS2AOP$$1b0bdc8$$MethodInvocation$$findByCondition6.proceed(MethodInvocationClassGenerator.java)
at com.fjh.struts.service.SsoService$$EnhancedByS2AOP$$1b0bdc8.findByCondition(SsoService$$EnhancedByS2AOP$$1b0bdc8.java)
at com.fjh.struts.service.AbstractEntityServiceTest.testFindByCondition(AbstractEntityServiceTest.java:255)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.seasar.framework.unit.S2TestMethodRunner.executeMethodBody(S2TestMethodRunner.java:678)
at org.seasar.framework.unit.S2TestMethodRunner.executeMethod(S2TestMethodRunner.java:653)
at org.seasar.framework.unit.S2TestMethodRunner.runTest(S2TestMethodRunner.java:618)
at org.seasar.framework.unit.S2TestMethodRunner.runMethod(S2TestMethodRunner.java:256)
at org.seasar.framework.unit.S2TestMethodRunner.run(S2TestMethodRunner.java:172)
at org.seasar.framework.unit.S2TestClassMethodsRunner.invokeTestMethod(S2TestClassMethodsRunner.java:227)
at org.seasar.framework.unit.S2TestClassMethodsRunner.run(S2TestClassMethodsRunner.java:89)
at org.seasar.framework.unit.S2TestClassRunner.run(S2TestClassRunner.java:67)
at org.seasar.framework.unit.Seasar2.run(Seasar2.java:168)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Seasar-user メーリングリストの案内