[S2Struts]backport175アノテーション
フォーム名のアノテーションを指定した場合、実際にはその他のたとえばRequiredなどを指定してしないと有効にならないようで、”employeeForm”が見つからないというエラーが(Mayaaaで)発生してしまう。

/**
 * @org.seasar.struts.annotation.backport175.StrutsActionForm(name="employeeForm")
 */

[S2Dao]副問い合わせ
副問い合わせの結果からレコードを削除するSQLがエラーとなる

DELETE FROM テーブル WHERE ID IN (SELECT ID FROM テーブル WHERE 条件)

SQLは実行されているので結果としては問題ないが、例外が飛んでくるのが非常に困る。

org.seasar.framework.exception.SQLRuntimeException: [ESSR0071]SQLで例外が発生しました。理由はjava.sql.SQLException: 定義がありません。
	at org.seasar.extension.jdbc.impl.BasicSelectHandler.execute(BasicSelectHandler.java:124)
	at org.seasar.dao.impl.SelectDynamicCommand.execute(SelectDynamicCommand.java:40)
	at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:36)
	at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:41)
	at org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:50)
	at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:41)
	at org.seasar.framework.aop.interceptors.InterceptorChain.invoke(InterceptorChain.java:41)
	at jnes.dao.CheckResultDtoDao$$EnhancedByS2AOP$$e4bb3c$$MethodInvocation$$eraseSandwichedUnplannedCheckResult4.proceed(MethodInvocationClassGenerator.java)
	at jnes.dao.CheckResultDtoDao$$EnhancedByS2AOP$$e4bb3c.eraseSandwichedUnplannedCheckResult(CheckResultDtoDao$$EnhancedByS2AOP$$e4bb3c.java)
	at jnes.dao.CheckResultDtoDaoTest.testDeleteSandwichedUnplannedCheckResult(CheckResultDtoDaoTest.java:46)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at org.seasar.framework.unit.S2FrameworkTestCase.runTestTx(S2FrameworkTestCase.java:396)
	at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:184)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: 定義がありません。
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
	at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:814)
	at oracle.jdbc.driver.OracleStatement.check_row_prefetch_changed(OracleStatement.java:2726)
	at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:249)
	at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:213)
	at org.seasar.extension.jdbc.impl.ResultSetWrapper.next(ResultSetWrapper.java:207)
	at org.seasar.extension.jdbc.impl.ObjectResultSetHandler.handle(ObjectResultSetHandler.java:32)
	at org.seasar.extension.jdbc.impl.BasicSelectHandler.execute(BasicSelectHandler.java:165)
	at org.seasar.extension.jdbc.impl.BasicSelectHandler.execute(BasicSelectHandler.java:137)
	at org.seasar.extension.jdbc.impl.BasicSelectHandler.execute(BasicSelectHandler.java:122)
	... 23 more


backport175.Required

チェックボックス等で配列のプロパティを使用している場合に、Requiredを指定してもValidationの対象にならない。当然クライアントサイドJavaScriptが生成されない…これは仕様?またプリミティブ型の配列の場合、ClassCastExceptionが出る…

java.lang.ClassCastException
	at org.apache.commons.validator.Field.getIndexedProperty(Field.java:736)
	at org.apache.commons.validator.Field.validate(Field.java:830)
	at org.apache.commons.validator.Form.validate(Form.java:290)
	at org.apache.commons.validator.Validator.validate(Validator.java:353)
	at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:110)
	at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:927)
	at org.seasar.struts.processor.S2RequestProcessor.processValidate(S2RequestProcessor.java:115)
	at org.seasar.struts.processor.ValidateProcessorImpl.processValidate(ValidateProcessorImpl.java:64)
	at org.seasar.struts.processor.S2RequestProcessor.processS2Validate(S2RequestProcessor.java:108)
	at org.seasar.struts.processor.AcceptorImpl.process(AcceptorImpl.java:89)
	at org.seasar.struts.processor.S2RequestProcessor.process(S2RequestProcessor.java:59)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Mask:制御文字のエスケープ

たとえば、アップロードされたファイルの拡張子を正規表現でチェックする場合に、

/**
 * @org.seasar.struts.validator.annotation.backport175.Mask(pattern="\\.csv$")
 */

という感じでアノテーションを指定する。当然、”.”をエスケープする必要があるのだが、その場合に生成されるJavaScript

\\\\.csv

という感じでエスケープ文字がエスケープされてしまい、期待通りの正規表現が生成されない。backport175、アノテーション等は全くの素人のため何をどうしていいのかがわからない…

V1.2動作確認

●Actionがnullを返した場合にExceptionが発生する問題を修正しました
●ファイルアップロード時、pageタグが動作しない問題を修正しました
struts-configのinputを指定しなくて、かつ pageタグも利用しない場合に
 Validationを行うとStackOverflowErrorが発生する問題を修正しました
○Validatorアノテーションを配列、ネストしたオブジェクトに対応しました
●RegistActionClassPlugInをRegisterActionClassPlugInに変更しました
 ※●:確認済み、○未確認(必要になったら…)

→これで再来週のプロトリリースに間に合う。