[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 メーリングリストの案内