入門記2:動かしてみた際の補足。
前回のエントリに説明不足がちらほらと><
まず、Derbyですが最新のものをダウンロードするとpom.xmlに書いたものとのバージョンに差異があるから絶対動いてやんねーよ的なエラーが出てしまいます。なので、ダウンロードしてきたDerbyのlib/derby.jarをプロジェクト直下のlibフォルダにコピーして、これを使うようpom.xmlのdependenciesを以下のように書き換えます。
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.3.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.escafe.buri</groupId> <artifactId>buri-core</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>geronimo-spec</groupId> <artifactId>geronimo-spec-jta</artifactId> <version>1.0-M1</version> </dependency> <!--// ここを書き変えた //--> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.4.2.0</version> <scope>system</scope> <systemPath>${basedir}/lib/derby.jar</systemPath> </dependency> </dependencies>
これで、DerbyのライブラリはMavenのセントラル・リポジトリではなくローカルのjarファイルを参照しますので、バージョンの差異によるDBアクセスのエラーは出なくなります。ちなみに、DBアクセスのエラーが出た場合の確認にBao用のテストを使うと結構時間を取ってしまうので、DocumentDaoのテストを作って確認するなどとしてました。
続いて、Buriが内部でどういったデータを残していくのか、というのを知る事でBuriのお仕事のアウトプットを理解しようと以下のように前回使ったBaoのテストコードを拡張してみました。
public class DocumentBaoTest2 extends S2TestCase { private static final String DICON_PATH = "app.dicon"; private DocumentBao bao; private BuriBranchDao buriBranchDao; private BuriDataDao buriDataDao; private BuriDataPathHistoryDao buriDataPathHistoryDao; private BuriPathDao buriPathDao; private BuriStateDao buriStateDao; private BuriStateUndoLogDao buriStateUndoLogDao; private BuriStateUserDao buriStateUserDao; private BuriTransactionDao buriTransactionDao; private BuriUserDao buriUserDao; @Override protected void setUp() throws Exception { super.setUp(); super.include(DICON_PATH); this.buriBranchDao = (BuriBranchDao) super.getComponent(BuriBranchDao.class); this.buriDataDao = (BuriDataDao) super.getComponent(BuriDataDao.class); this.buriDataPathHistoryDao = (BuriDataPathHistoryDao) super.getComponent(BuriDataPathHistoryDao.class); this.buriPathDao = (BuriPathDao) super.getComponent(BuriPathDao.class); this.buriStateDao = (BuriStateDao) super.getComponent(BuriStateDao.class); this.buriStateUndoLogDao = (BuriStateUndoLogDao) super.getComponent(BuriStateUndoLogDao.class); this.buriStateUserDao = (BuriStateUserDao) super.getComponent(BuriStateUserDao.class); this.buriTransactionDao = (BuriTransactionDao) super.getComponent(BuriTransactionDao.class); this.buriUserDao = (BuriUserDao) super.getComponent(BuriUserDao.class); } public void testTx() { DocumentDto doc1 = new DocumentDto("文書A", "文書Aです。"); DocumentDto doc2 = new DocumentDto("文書B", "文書Bです。"); DocumentDto doc3 = new DocumentDto("文書C", "文書Cです。"); // 1st this.bao.register(doc1); System.out.println(this.bao.getPublishings().size()); assertEquals(1, this.bao.getPublishings().size()); // 2nd this.bao.register(doc2); this.bao.register(doc3); assertEquals(3, this.bao.getPublishings().size()); // 3rd this.bao.finishPublishing(doc1); assertEquals(2, this.bao.getPublishings().size()); // 4th this.bao.finishPublishing(doc2); this.bao.finishPublishing(doc3); assertEquals(0, this.bao.getPublishings().size()); // 覗き this.checkData(); } private void checkData() { this.output(this.buriBranchDao.getAllBuriBranch(), BuriBranchEntityDto.class.getName()); this.output(this.buriDataDao.getAllBuriData(), BuriDataDao.class.getName()); this.output(this.buriDataPathHistoryDao.getAllBuriDataPathHistory(), BuriDataPathHistoryEntityDto.class.getName()); this.output(this.buriPathDao.getAllBuriPath(), BuriPathDao.class.getName()); this.output(this.buriStateDao.getAllBuriState(), BuriStateEntityDto.class.getName()); this.output(this.buriStateUndoLogDao.getAllBuriState(), BuriStateUndoLogEntityDto.class.getName()); this.output(this.buriStateUserDao.getAllBuriBranch(), BuriStateUserEntityDto.class.getName()); this.output(this.buriTransactionDao.getAllBuriBranch(), BuriTransactionEntityDto.class.getName()); this.output(this.buriUserDao.getAllBuriBranch(), BuriUserEntityDto.class.getName()); DocumentDao docDao = (DocumentDao) super.getComponent("DocumentDao"); this.output(docDao.selectAll(), DocumentDto.class.getName()); } private void output(List<?> list, String dtoName) { if (list.size() == 0) { System.out.println("\n***** " + dtoName + " *****"); System.out.println("size=0"); return; } System.out.println("\n***** " + dtoName + " *****"); for (Object o: list) { System.out.println(o.toString()); } } }
ロジックだせー、という突っ込みがあれば甘んじて受けます><
Buri固有のテーブルそれぞれのDaoとDtoを使って中身を全部出力してやれ、という狙いですね。これを実行すると・・・
org.seasar.dao.MethodSetupFailureRuntimeException: [EDAO0019]org.escafe.buri.dao.BuriTransactionDaoのselectFromDtoメソッドの初期化時に例外が発生しました。理由はorg.seasar.extension.jdbc.ColumnNotFoundRuntimeException: [ESSR0068]テーブル(BuriTransaction)のカラム(dto)が見つかりません
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:187)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:164)
at org.seasar.dao.impl.DaoMetaDataImpl.setupSqlCommand(DaoMetaDataImpl.java:158)
at org.seasar.dao.impl.DaoMetaDataImpl.initialize(DaoMetaDataImpl.java:144)
at org.seasar.dao.impl.DaoMetaDataFactoryImpl.createDaoMetaData(DaoMetaDataFactoryImpl.java:123)
at org.seasar.dao.impl.DaoMetaDataFactoryImpl.getDaoMetaData(DaoMetaDataFactoryImpl.java:105)
at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:51)
at org.seasar.dao.pager.PagerS2DaoInterceptorWrapper.invoke(PagerS2DaoInterceptorWrapper.java:65)
at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:43)
at org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:59)
at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:43)
at org.seasar.framework.aop.interceptors.InterceptorChain.invoke(InterceptorChain.java:42)
at org.escafe.buri.dao.BuriTransactionDao$$EnhancedByS2AOP$$ff9053$$MethodInvocation$$getAllBuriBranch0.proceed(MethodInvocationClassGenerator.java)
at org.escafe.buri.dao.BuriTransactionDao$$EnhancedByS2AOP$$ff9053.getAllBuriBranch(BuriTransactionDao$$EnhancedByS2AOP$$ff9053.java)
at tryapp.bao.DocumentBaoTest2.checkData(DocumentBaoTest2.java:87)
at tryapp.bao.DocumentBaoTest2.testTx(DocumentBaoTest2.java:77)
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:168)
at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:305)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:92)
at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:190)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76)
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)
Caused by: org.seasar.extension.jdbc.ColumnNotFoundRuntimeException: [ESSR0068]テーブル(BuriTransaction)のカラム(dto)が見つかりません
at org.seasar.dao.impl.BeanMetaDataImpl.convertFullColumnName(BeanMetaDataImpl.java:233)
at org.seasar.dao.impl.DaoMetaDataImpl.createAutoSelectSql(DaoMetaDataImpl.java:717)
at org.seasar.dao.impl.DaoMetaDataImpl.setupNonQuerySelectMethodByArgs(DaoMetaDataImpl.java:635)
at org.seasar.dao.impl.DaoMetaDataImpl.setupNonQuerySelectMethodByAuto(DaoMetaDataImpl.java:602)
at org.seasar.dao.impl.DaoMetaDataImpl.setupSelectMethodByAuto(DaoMetaDataImpl.java:575)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethodByAuto(DaoMetaDataImpl.java:295)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:184)
... 36 more
BuriTransactionDaoはBURITRANSACTIONテーブルがそのターゲットになるテーブルであるのですが、これがBuriの中にあるDaoである点を考慮して、この例外がほぼ間違いなく僕のせいだと思います。S2Daoは全然詳しくないので、早くも脇道にそれそうな予感がしますが、今日はなぜか恐ろしく眠いので続きはまた><